Коллеги, приветствую.
Есть некоторый конфигурационный Web- сервис, размещенный в пакете Custom.
Я хочу иметь возможность вызывать его методы из консольного приложения, для этого мне, соответственно, необходимо сгенерировать классы клиента по WSDL.
Как получить доступ к WSDL моего сервиса?
Был бы весьма признателен за информацию.
Спасибо.
--
С уважением, Алексей Быков.
Нравится
Или же SOAP Web- сервисы и клиенты полностью разрабатываются в MS Visual Studio, а затем код Web- сервиса переносится (копируется) в конфигурационный?
Добрый день.
WSDL можно получить, например, так:
https://my_site/0/ServiceModel/my_web_service.svc?wsdl
Здравствуйте, Артем! Спасибо. Про параметр wsdl я знаю.. Не могли бы Вы проконсультировать
относительно пути до Web- сервиса -
[code]
ttps://my_site/0/ServiceModel/my_web_service.svc?wsdl
[/code]
my_site - ? (в принципе, понятно...)
ServiceModel - ?
Требуется- ли какая- либо дополнительная настройка?
Ой, сорри, немного ошибся. Это не совсем конфигурационные web-сервисы.
Путь складывается так:
https://имя_сайта/0/rest/имя_сервиса
(это можно увидеть в модуле ServiceHelper)
Далее, что касается wsdl. По конфигурационным сервисам не получится получить wsdl. С ними нужно работать как с REST - простимы Post/Get запросами
При таких запросах:
[code]
http://localhost:8080/WebApp/0/ServiceModel/PaymentsRegisterService.svc…
http://localhost:8080/0/ServiceModel/PaymentsRegisterService.svc?wsdl
[/code]
Такая ошибка:
[code]
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
[/code]
Артем, спасибо большое за ответ.
Так... а что же делать? Есть- ли возможность разработки 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
[csharp]
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; }
}
}
}
[/csharp]
и схему исходного кода c реализацие сервиса:
SPMSUBPService
[csharp]
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();
}
}
}
[/csharp]
В папке 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
[xml]
...
...
[/xml]
Модифицируем Terrasoft.WebApp\Web.config
Web.config
[xml]
...
...
[/xml]
Готово!
Сервис доступен по адресу: /0/ServiceModel/SPMSUBPService.svc
WSDL тоже есть: /0/ServiceModel/SPMSUBPService.svc?singleWsdl
Артем, спасибо большое за ответ, попробую сделать.
При попытке создания прокси WCF стали появляться ошибки.
1. Если в проект консольного приложения MS Visual Studio добавить ссылку на wsdl Web- сервиса (Add service reference):
[code]
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:
--
Object moved
Object moved to here.
--
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.
[/code]
2. Если для генерации прокси- классов использовать ServiceModel Metadata Utility Tool (Svcutil.exe), то следующая команда:
[code]
svcutil.exe /language:cs /out:generatedProxy.cs /config:app.config h t t p://localhost:8080/0/ServiceModel/UsrSPMSUBPService.svc?wsdl
[/code]
Завершается с такой ошибкой:
[code]
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"
Сбой запроса с сообщением об ошибке
Object moved
Object moved to here.
[/code]
Сам сервис и WSDL доступны:
--
UsrSPMSUBPService Служба
Служба создана.
Чтобы протестировать эту службу, необходимо создать клиент и воспользоваться им для вызова службы. Это можно сделать, запустив программу svcutil.exe из командной строки со следующим синтаксисом:
svcutil.exe http://localhost:8080/0/ServiceModel/UsrSPMSUBPService.svc?wsdl
Доступ к описанию службы также можно получить как к одному файлу:
http://localhost:8080/0/ServiceModel/UsrSPMSUBPService.svc?singleWsdl
Это ведет к созданию файла конфигурации и файла кода, содержащего класс клиента. Добавьте эти два файла в клиентское приложение и используйте сгенерированный класс клиента для вызова службы. Например:
C#
[csharp]
class Test
{
static void Main()
{
ServiceClient client = new ServiceClient();
// Используйте переменную "client", чтобы вызвать операции из службы.
// Всегда закройте клиент.
client.Close();
}
}
[/csharp]
Visual Basic
[csharp]
Class Test
Shared Sub Main()
Dim client As ServiceClient = New ServiceClient()
' Используйте переменную "client", чтобы вызвать операции из службы.
' Всегда закройте клиент.
client.Close()
End Sub
End Class
[/csharp]
Почему не удается сгенерировать прокси- классы?
C ?FlatWsdl я удаляю все ссылки xsd:import, но это не помогает.
Артем, не могли бы Вы подсказать, как теперь сгенерировать прокси- классы для клиента?
Получилось примерно таким образом.
Есть утилита wsdl.exe
[code]
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\wsdl.exe
[/code]
С ее помощью можно сгенерировать прокси- классы из сохраненного локально WSDL- файла. Далее скомпилировать эти классы в сборку и включить ссылку на сборку в проект консольного клиента, ну а дальше вызывать методы Web- сервиса из клиента, используя прокси- классы.
На этом тему можно считать закрытой.