Коллеги, приветствую.
Есть некоторый конфигурационный Web- сервис, размещенный в пакете Custom.
Я хочу иметь возможность вызывать его методы из консольного приложения, для этого мне, соответственно, необходимо сгенерировать классы клиента по WSDL.
Как получить доступ к WSDL моего сервиса?
Был бы весьма признателен за информацию.
Спасибо.
--
С уважением, Алексей Быков.
Нравится
Или же SOAP Web- сервисы и клиенты полностью разрабатываются в MS Visual Studio, а затем код Web- сервиса переносится (копируется) в конфигурационный?
Добрый день.
WSDL можно получить, например, так:
https://my_site/0/ServiceModel/my_web_service.svc?wsdl
Здравствуйте, Артем! Спасибо. Про параметр wsdl я знаю.. Не могли бы Вы проконсультировать
относительно пути до Web- сервиса -
ttps://my_site/0/ServiceModel/my_web_service.svc?wsdl
my_site - ? (в принципе, понятно...)
ServiceModel - ?
Требуется- ли какая- либо дополнительная настройка?
Ой, сорри, немного ошибся. Это не совсем конфигурационные web-сервисы.
Путь складывается так:
https://имя_сайта/0/rest/имя_сервиса
(это можно увидеть в модуле ServiceHelper)
Далее, что касается wsdl. По конфигурационным сервисам не получится получить wsdl. С ними нужно работать как с REST - простимы Post/Get запросами
При таких запросах:
http://localhost:8080/WebApp/0/ServiceModel/PaymentsRegisterService.svc?wsdl http://localhost:8080/0/ServiceModel/PaymentsRegisterService.svc?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 прокси- классы?..
К вопросу об интеграции..
https://www.terrasoft.ru/products/bpmonline/integration
Web-сервисы
Интеграция приложений bpm’online с другими системами посредством web-сервисов позволяет существенно упростить процесс и значительно сократить время синхронизации данных.
Поддержка открытых стандартов (SOAP, WSDL) и широкая сфера применения web-сервисов позволяет связывать в единую информационную среду бизнес-приложения и системы, созданные на базе различных технологий.
Платформа bpm’online позволяет запрашивать данные из сторонних систем для передачи в bpm’online , равно как и вызывать собственные web-сервисы для получения данных из bpm’online.
Вполне вероятно, что мне подойдет WCF Web- сервис. DLL можно разместить в IIS и получить WSDL.
Добрый день!
Собственно то, о чем я говорил в самом первом ответе :), но для этого нужно дополнительные настройки (только если у Вас on-site)
В конфигурации создаем схему исходного кода c контрактом сервиса:
SPMSUBPServiceContract
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; namespace SPMSUBPService { [ServiceContract] public interface IService { [OperationContract] SPMClientInfoResponse SPMClientInfo(string Login); } [DataContract] public class SPMClientInfoResponse { bool success = true; string errorText = ""; [DataMember] public bool Success { get { return success; } set { success = value; } } [DataMember] public string ErrorText { get { return errorText; } set { errorText = value; } } } }
и схему исходного кода c реализацие сервиса:
SPMSUBPService
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; namespace SPMSUBPService { public class SPMSUBPService : IService { public SPMClientInfoResponse SPMClientInfo(string Login) { return new SPMClientInfoResponse(); } } }
В папке 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
<services> ... <service behaviorConfiguration="BaseServiceBehavior" name="SPMSUBPService.SPMSUBPService"> <endpoint name="SPMSUBPServiceEndPoint" binding="webHttpBinding" behaviorConfiguration="RestServiceBehavior" bindingNamespace="http://Terrasoft.WebApp.ServiceModel" contract="SPMSUBPService.IService" /> <endpoint address="soap" binding="basicHttpBinding" contract="SPMSUBPService.IService"/> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> ... </services>
Модифицируем Terrasoft.WebApp\Web.config
Web.config
... <location path="ServiceModel/SPMSUBPService.svc"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location> ...
Готово!
Сервис доступен по адресу: /0/ServiceModel/SPMSUBPService.svc
WSDL тоже есть: /0/ServiceModel/SPMSUBPService.svc?singleWsdl
Артем, спасибо большое за ответ, попробую сделать.
При попытке создания прокси 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>
Сам сервис и WSDL доступны:
--
UsrSPMSUBPService Служба
Служба создана.
Чтобы протестировать эту службу, необходимо создать клиент и воспользоваться им для вызова службы. Это можно сделать, запустив программу svcutil.exe из командной строки со следующим синтаксисом:
svcutil.exe http://localhost:8080/0/ServiceModel/UsrSPMSUBPService.svc?wsdl
Доступ к описанию службы также можно получить как к одному файлу:
http://localhost:8080/0/ServiceModel/UsrSPMSUBPService.svc?singleWsdl
Это ведет к созданию файла конфигурации и файла кода, содержащего класс клиента. Добавьте эти два файла в клиентское приложение и используйте сгенерированный класс клиента для вызова службы. Например:
C#
class Test { static void 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
Почему не удается сгенерировать прокси- классы?
C ?FlatWsdl я удаляю все ссылки xsd:import, но это не помогает.
Артем, не могли бы Вы подсказать, как теперь сгенерировать прокси- классы для клиента?
Получилось примерно таким образом.
Есть утилита wsdl.exe
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\wsdl.exe
С ее помощью можно сгенерировать прокси- классы из сохраненного локально WSDL- файла. Далее скомпилировать эти классы в сборку и включить ссылку на сборку в проект консольного клиента, ну а дальше вызывать методы Web- сервиса из клиента, используя прокси- классы.
На этом тему можно считать закрытой.