Собственно вопрос - как разрешить удаленный вызов процедур Web- сервиса? Есть простой WCF Web- сервис, на его основе получен WSDL, из которого сгенерированы прокси- классы. Эти прокси- классы использует простой консольный клиент, например, просто вернуть строку с сервера - вылетает окно:
Судя по ссылке, запрос не проходит авторизацию, хотя в Terrasoft.WebApp\Web.config указано, что:
Отличная статья, как я теперь могу вызвать метод Web- сервиса, используя AuthCookie? Должен- ли я менять код Web- сервиса, чтобы аутентифицировать внешние запросы?
Возвращаясь к началу, хочу отметить одну интересную деталь - если в Visual Studio попытаться добавить ссылку на WSDL (Add Web Reference), то получим такое вот окно:
Есть некоторый конфигурационный Web- сервис, размещенный в пакете Custom.
Я хочу иметь возможность вызывать его методы из консольного приложения, для этого мне, соответственно, необходимо сгенерировать классы клиента по WSDL.
Date: 14.04.2016 16:07:28
Date (UTC): 14.04.2016 12:07:28
Exception Message: The service '/WebApp/0/ServiceModel/PaymentsRegisterService.svc' does not exist.
Exception Type: System.ServiceModel.EndpointNotFoundException
Exception Source: System.ServiceModel.Activation
Exception Stack Trace:
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath, EventTraceActivity eventTraceActivity)
at System.ServiceModel.ServiceHostingEnvironment.EnsureServiceAvailableFast(String relativeVirtualPath, EventTraceActivity eventTraceActivity)
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.HandleRequest()
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.BeginRequest()
SessionID: k1zrorhl53nfgmtswhcohchx
Request URL:/WebApp/0/ServiceModel/PaymentsRegisterService.svc?wsdl
Request Path:/WebApp/0/ServiceModel/PaymentsRegisterService.svc
Request Type: GET
User Agent: Mozilla/5.0(Windows NT 6.1; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36
User Host Address:::1
User: Пользователь 1
Is Authenticated: True
Authentication Type: Forms
Is Secure Connection: False
Application Version: 7.7.0.2872
Application Path: C:\terrasoft\BankCustomerJourney770_Demo\
Application Virtual Path:/
Application Trust Level: Full
Machine Name: ALEKSEYBYKOV-PC
Is Local: True
Process ID:17564
Process Name: iisexpress.exe
Process Account Name: AlekseyBykov-PC\Aleksey-Bykov
Thread Account Name: AlekseyBykov-PC\Aleksey-Bykov
OS Version: Microsoft Windows NT 6.1.7601 Service Pack 1
Net Framework Version: 4.0.30319.42000
DBExecutor Type: MSSqlExecutor
Артем, спасибо большое за ответ.
Так... а что же делать? Есть- ли возможность разработки SOAP Web- сервисов? Если я хочу (нужно) из внешнего приложения обращаться к Web- сервису bpmonline, генерируя по его WSDL прокси- классы?..
Web-сервисы
Интеграция приложений bpm’online с другими системами посредством web-сервисов позволяет существенно упростить процесс и значительно сократить время синхронизации данных.
Поддержка открытых стандартов (SOAP, WSDL) и широкая сфера применения web-сервисов позволяет связывать в единую информационную среду бизнес-приложения и системы, созданные на базе различных технологий.
Платформа bpm’online позволяет запрашивать данные из сторонних систем для передачи в bpm’online , равно как и вызывать собственные web-сервисы для получения данных из bpm’online.
В папке Terrasoft.WebApp\ServiceModel создаем файл SPMSUBPService.svc с текстом:
SPMSUBPService.svc
<%@ ServiceHost Language="C#" Debug="true" Service="SPMSUBPService.SPMSUBPService" Factory="System.ServiceModel.Activation.ServiceHostFactory" %>
Добавляем в файл Terrasoft.WebApp\ServiceModel\http\services.config описание нашего сервиса:
services.config
При попытке создания прокси WCF стали появляться ошибки.
1. Если в проект консольного приложения MS Visual Studio добавить ссылку на wsdl Web- сервиса (Add service reference):
An error occured while attempting to find services at h t t p://localhost:8080/0/ServiceModel/UsrSPMSUBPService.svc?wsdl
Details
Was an error downloading ' h t t p://localhost:8080/0/ServiceModel/UsrSPMSUBPService.svc?wsdl/$metadata'.
The request failed with the error message:--<html><head><title>Object moved</title></head><body><h2>Object moved to <a href="/0/ServiceModel/UsrSPMSUBPService.svc?wsdl/$metadata">here</a>.</h2></body></html>--
Metadata contains a reference that cannot be resolved:'h t t p://localhost:8080/0/ServiceModel/UsrSPMSUBPService.svc?wsdl'.
The remote server returned an unexpected response:(302) Found.
Too many automatic redirections were attempted.
If the service is defined in the current solution, try building the solution and adding the service reference again.
2. Если для генерации прокси- классов использовать ServiceModel Metadata Utility Tool (Svcutil.exe), то следующая команда:
svcutil.exe/language:cs /out:generatedProxy.cs/config:app.config h t t p://localhost:8080/0/ServiceModel/UsrSPMSUBPService.svc?wsdl
Завершается с такой ошибкой:
WS-Metadata Exchange Error
URI: h t t p://localhost:8080/0/ServiceModel/UsrSPMSUBPService?wsdl
Метаданные содержат неразрешимую ссылку "h t t p://localhost:8080/0/ServiceModel/UsrSPMSUBPService?wsdl"
Удаленный сервер вернул неожиданный ответ:(302) Found.
Слишком много попыток автоматического перенаправления.
HTTP Get Error
URI: h t t p://localhost:8080/0/ServiceModel/UsrSPMSUBPService?wsdl
Возникла ошибка при загрузке "h t t p://localhost:8080/0/ServiceModel/UsrSPMSUBPService?wsdl"
Сбой запроса с сообщением об ошибке
<html><head><title>Object moved</title></head><body><h2>Object moved to <a href="/0/ServiceModel/UsrSPMSUBPService.svc?wsdl/$metadata">here</a>.</h2></body></html>
Чтобы протестировать эту службу, необходимо создать клиент и воспользоваться им для вызова службы. Это можно сделать, запустив программу svcutil.exe из командной строки со следующим синтаксисом:
class Test
{staticvoid Main(){
ServiceClient client =new ServiceClient();// Используйте переменную "client", чтобы вызвать операции из службы.// Всегда закройте клиент.
client.Close();}}
Visual Basic
Class Test
Shared Sub Main()
Dim client As ServiceClient = New ServiceClient()' Используйте переменную "client", чтобы вызвать операции из службы.
' Всегда закройте клиент.
client.Close()
End Sub
End Class
С ее помощью можно сгенерировать прокси- классы из сохраненного локально WSDL- файла. Далее скомпилировать эти классы в сборку и включить ссылку на сборку в проект консольного клиента, ну а дальше вызывать методы Web- сервиса из клиента, используя прокси- классы.