13

私はサードパーティと協力して、私たちのシステムの一部を彼らのシステムと統合しようとしています。サードパーティは、接続されたシステムで特定の要求と変更を行うための SOAP インターフェイスを提供してくれます。私にとっての問題は、私が作業するための WSDL ファイルが提供されていないことです。WSDL ファイルがあれば、提供された .NET コマンド (wsdl.exe) を実行し、サービスと対話するプロキシ クラスを生成するだけで簡単にできます。

WSDL ファイルなしでこれを行う「簡単な」方法はありますか? アクセスできるすべての機能と、送信する必要があるパラメーターと、その見返りとして期待できるものはすべて揃っています。

WSDL ファイルのない SOAP サービスを使用することは一般的ですか? (将来、さらに多くの外部システムをミックスに追加する予定なので、私はこれを求めています)

WDSL を使用しないサービスに対してプロキシ クラスまたはその他の形式のクライアントを作成した人はいますか?

4

4 に答える 4

7
string EndPoints = "http://203.189.91.127:7777/services/spm/spm";

string New_Xml_Request_String = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><soapenv:Body><OTA_AirLowFareSearchRQ EchoToken=\"0\" SequenceNmbr=\"0\" TransactionIdentifier=\"0\" xmlns=\"http://www.opentravel.org/OTA/2003/05\"><POS xmlns=\"http://www.opentravel.org/OTA/2003/05\"><Source AgentSine=\"\" PseudoCityCode=\"NPCK\"  TerminalID=\"1\"><RequestorID ID=\"\"/></Source><YatraRequests><YatraRequest DoNotHitCache=\"true\" DoNotCache=\"false\" MidOfficeAgentID=\"\" AffiliateID=\"\" YatraRequestTypeCode=\"SMPA\"/></YatraRequests></POS><TravelerInfoSummary><AirTravelerAvail><PassengerTypeQuantity Code=\"ADT\" Quantity=\"1\"/><PassengerTypeQuantity Code=\"CHD\" Quantity=\"1\"/><PassengerTypeQuantity Code=\"INF\" Quantity=\"1\"/></AirTravelerAvail></TravelerInfoSummary> <SpecificFlightInfo><Airline Code=\"\"/></SpecificFlightInfo><OriginDestinationInformation><DepartureDateTime>" + DateTime.Now.ToString("o").Remove(19, 14) + "</DepartureDateTime><OriginLocation CodeContext=\"IATA\" LocationCode=\"DEL\">" + Source + "</OriginLocation><DestinationLocation CodeContext=\"IATA\" LocationCode=\"BOM\">" + Destincation + "</DestinationLocation></OriginDestinationInformation><TravelPreferences><CabinPref Cabin=\"Economy\"/></TravelPreferences></OTA_AirLowFareSearchRQ></soapenv:Body></soapenv:Envelope>";


 protected string HttpSOAPRequest_Test(string xmlfile, string proxy)
    {
        try
        {
            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            doc.InnerXml = xmlfile.ToString();
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(EndPoints);
            req.Timeout = 100000000;
            if (proxy != null)
                req.Proxy = new WebProxy(proxy, true);
            req.Headers.Add("SOAPAction", "");
            req.ContentType = "application/soap+xml;charset=\"utf-8\"";
            req.Accept = "application/x-www-form-urlencoded"; //"application/soap+xml";
            req.Method = "POST";
            Stream stm = req.GetRequestStream();
            doc.Save(stm);
            stm.Close();
            WebResponse resp = req.GetResponse();
            stm = resp.GetResponseStream();
            StreamReader r = new StreamReader(stm);
            string myd = r.ReadToEnd();
            return myd;
        }

   catch (Exception se)
        {
            throw new Exception("Error Occurred in AuditAdapter.getXMLDocumentFromXMLTemplate()", se);
        }
    }
于 2010-09-14T10:46:41.550 に答える
4

から派生するクラスを作成する場合(およびクラスとそのメソッドに、 などSystem.Web.Services.Protocols.SoapHttpClientProtocolの正しい属性が適用されている場合)、WSDL ファイルを必要とせずに SOAP メソッドをかなり簡単に呼び出すことができます。WebServiceBindingSoapDocumentMethod

これを行う最も簡単な方法は、おそらく、サード パーティの SOAP API を複製する独自の ASP.NET Web サービスを作成し、そこからプロキシ クラスを生成し、ファイルを手動で編集して、URL、名前空間、メソッド名、パラメーターが確実に変更されるようにすることです。タイプなどは、呼び出すサードパーティ API に適しています。

于 2008-11-10T15:01:59.107 に答える
1

ここのコードは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)

私はこれがうまくいくはずだと思います....成功!

于 2009-01-05T14:57:04.357 に答える
1

WSDL ファイルにアクセスせずに SOAP インターフェースを作成したことはありませんが、その形式は十分に文書化されています。あなたの最善の策は、あなたが購読しているサービスについて知っていることを反映した、独自の単純化された WSDL ファイルを作成することかもしれません....

このルートに進むことにした場合、既存のスタックオーバーフローの質問は、WSDL を検証するためのいくつかのツールを指しています。

于 2008-11-10T15:01:41.337 に答える