SOAP-клиент на C# без доступа к WSDL-файлу

Я работаю с третьей стороной над интеграцией некоторых наших систем с их, и они предоставляют нам интерфейс SOAP для выполнения определенных запросов и изменений в их подключенных системах. Проблема для меня в том, что они не предоставляют мне WSDL-файл, с которым я мог бы работать. Если бы у меня был WSDL-файл, было бы просто запустить предоставленную команду .NET (wsdl.exe) и сгенерировать прокси-класс для взаимодействия со службой.

Есть ли «простой» способ сделать это без WSDL-файла? У меня есть все функции, к которым мы можем получить доступ, и какие параметры мне нужно отправить и что я должен ожидать взамен.

Часто ли используется SOAP-сервис без WSDL-файлов? (Я спрашиваю об этом, поскольку в будущем мы собираемся добавить больше внешних систем)

Кто-нибудь делал прокси-класс или любую другую форму клиента для службы без WDSL и у него есть хорошие советы о том, как это сделать?


person Kristoffer L    schedule 10.11.2008    source источник
comment
Я сейчас в той же лодке... ты нашел способ сделать это?   -  person MaLKaV_eS    schedule 14.08.2009
comment
К сожалению, нет. Выяснилось, что SOAP, к которому я пытался получить доступ, был недействителен и во многих других отношениях, поэтому проект был свернут.   -  person Kristoffer L    schedule 17.08.2009


Ответы (3)


Если вы пишете класс, производный от System.Web.Services.Protocols.SoapHttpClientProtocol (и имеющий правильные атрибуты, например, WebServiceBinding, SoapDocumentMethod и т. д., примененные к нему и его методам), вы можете довольно легко вызывать методы SOAP, не нуждаясь в файле WSDL.

Самый простой способ сделать это, вероятно, состоит в том, чтобы написать собственную веб-службу ASP.NET, которая реплицирует сторонний SOAP API, сгенерировать из него прокси-класс, а затем вручную отредактировать файл, чтобы убедиться, что URL-адрес, пространства имен, имена методов, параметры типы и т. д. верны для стороннего API, который вы хотите вызвать.

person Bradley Grainger    schedule 10.11.2008


код здесь в VB.NET, но я думаю, вы поняли идею. Ниже приведен клиент, который вызывает метод processConfirmation и ожидает ответа (MyBase.SendRequestResponse).

Imports Microsoft.Web.Services3
Imports Microsoft.Web.Services3.Addressing
Imports Microsoft.Web.Services3.Messaging

Namespace Logic
    Public Class HTTPClient
        Inherits Soapclient

        Sub New(ByVal destination As EndpointReference)
            MyBase.Destination = destination
        End Sub

        <SoapMethod("processConfirmation")> _
        Public Function processConfirmation(ByVal envelope As SoapEnvelope) As SoapEnvelope
            Return MyBase.SendRequestResponse("processConfirmation", envelope)
        End Function
    End Class
End Namespace

И вы используете его, делая следующее:

Dim hc As New HTTPClient(New Microsoft.Web.Services3.Addressing.EndpointReference(New System.Uri("http://whatever.srv")))

Dim envelope As New Microsoft.Web.Services3.SoapEnvelope
Dim doc As New Xml.XmlDocument
doc.LoadXml("<hey>there</hey>")
envelope.SetBodyObject(doc)

Dim return_envelope As Microsoft.Web.Services3.SoapEnvelope = hc.processConfirmation(envelope)

Я думаю, это должно сработать .... успехов!

person SpoBo    schedule 05.01.2009
comment
-1: для этого требуется WSE 3.0, который устарел и не должен использоваться, если нет других вариантов. - person John Saunders; 14.08.2009