1

Soap XML リクエスト用の C# コードを書きました。このコードが XML クラスを生成することを確認しました。

私の質問は、C# コードを使用してリクエストを送信し、レスポンスを受信する方法です。

私は XML の初心者なので、単純な間違いや基本的な間違いについては親切に教えてください。

SOAP XML リクエスト:

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ce="http://www." xmlns:os="http://www.domainname.com/schema/soap/v1" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <soapenv:Header /> 
    <soapenv:Body>
        <ce:message>
            <ce:m_control>
                <os:control_timestamp>2001-12-31T12:00:00</os:control_timestamp> 
                <os:message_id>000000000000000000000000000000000</os:message_id> 
                <os:message_type>Contract Enquiry Request</os:message_type> 
                <os:message_version>ce/v2.2/NameContractRequest</os:message_version> 
                <os:expected_response_type>synchronous</os:expected_response_type> 
                <os:initiator_id>initiator_id</os:initiator_id> 
                <os:initiator_orchestration_id>initiator_orchestration_id</os:initiator_orchestration_id> 
                <os:KeyInfo>
                    <ds:X509Data>
                        <ds:X509IssuerSerial>
                            <ds:X509IssuerName>CN=OSIS Customer CA, O=Origo Secure Internet Services Ltd., CN=OSIS Customer CA</ds:X509IssuerName> 
                            <ds:X509SerialNumber>111111111111111111111111111111111111</ds:X509SerialNumber> 
                        </ds:X509IssuerSerial>
                        <ds:X509SubjectName>C=GB, O=FirmID3400010000023NR11QQ, OU=CPS - www.unipass.co.uk/cps, OU=Warning/Terms of Use - www.unipass.co.uk/tou, OU=EmployeeID10101101010101, OU=TPSP2, OU=BPNR1 1QQ, CN=Testt Orgg/emailAddress=Fname.Lname@aviva.co.uk</ds:X509SubjectName> 
                    </ds:X509Data>
                </os:KeyInfo>
                <os:responder_id>os:responder_id</os:responder_id> 
            </ce:m_control>
            <ce:m_content>
                <ce:b_control>
                    <ce:contract_enquiry_reference>TestRequest</ce:contract_enquiry_reference> 
                </ce:b_control>
                <ce:intermediary>
                    <ce:FirmFSARef id="idvalue14">456123</ce:FirmFSARef> 
                </ce:intermediary>
                <ce:request_scope>
                    <ce:contract_details_required_ind>No</ce:contract_details_required_ind> 
                    <ce:valuation_currency>GBP</ce:valuation_currency> 
                    <ce:fund_code_type_required>SEDOL</ce:fund_code_type_required> 
                    <ce:valuation_request ce:type="Current" /> 
                </ce:request_scope>
                <ce:contract>
                    <ce:contract_reference_number>TL12345678</ce:contract_reference_number> 
                </ce:contract>
            </ce:m_content>
        </ce:message>
    </soapenv:Body>
</soapenv:Envelope>
################################################ C# コード##################

Guid CEGuid = Guid.NewGuid(); 文字列 GuidString = CEGuid.ToString();

        string CEVersion = "";
        string URL = "";
        string ResponderId = "";
        string ContractDetailsRequired = "Yes";

        using (XmlTextWriter xmlRequestWriter = new XmlTextWriter(@"C:/Unipass/PensionRequest.xml", Encoding.UTF8))
        {
            xmlRequestWriter.WriteStartDocument();

            xmlRequestWriter.WriteComment("This file is generated by the program.");

            xmlRequestWriter.WriteStartElement("soapenv:Envelope");

            xmlRequestWriter.WriteAttributeString("xmlns:soapenv", null, "http://schemas.xmlsoap.org/soap/envelope/");
            xmlRequestWriter.WriteAttributeString("xmlns:ce", null, "http://www.WhateveryDomain.com/schema/ce/v2.2/WhateverRequest");
            xmlRequestWriter.WriteAttributeString("xmlns:os", null, "http://www.WhateveryDomain.com/schema/soap/v1");
            xmlRequestWriter.WriteAttributeString("xmlns:ds", null, "http://www.w3.org/2000/09/xmldsig#");

            xmlRequestWriter.WriteStartElement("soapenv:Header");
            xmlRequestWriter.WriteEndElement();

            xmlRequestWriter.WriteStartElement("ce:message");
            xmlRequestWriter.WriteStartElement("ce:m_control");
            xmlRequestWriter.WriteElementString("os:control_timestamp", DateTime.Now.ToString("s"));
            xmlRequestWriter.WriteElementString("os:message_id", GuidString);
            xmlRequestWriter.WriteElementString("os:message_type", "Contract Enquiry Request");
            xmlRequestWriter.WriteElementString("os:message_version", "ce/v2.2/WhateverRequest");
            xmlRequestWriter.WriteElementString("os:expected_response_type", "synchronous");
            xmlRequestWriter.WriteElementString("os:initiator_id", "initiator_id");
            xmlRequestWriter.WriteElementString("os:initiator_orchestration_id", "initiator_orchestration_id");
            xmlRequestWriter.WriteStartElement("os:KeyInfo");
            xmlRequestWriter.WriteStartElement("ds:X509Data");
            xmlRequestWriter.WriteStartElement("ds:X509IssuerSerial");
            xmlRequestWriter.WriteElementString("ds:X509IssuerName", "CN=OSIS Customer CA, O=Origo Secure Internet Services Ltd., CN=OSIS Customer CA");
            xmlRequestWriter.WriteElementString("ds:X509SerialNumber", "111111111111111111111111111111111");
            xmlRequestWriter.WriteEndElement();
            xmlRequestWriter.WriteElementString("ds:X509SubjectName", "C=GB, O=FirmID3400010000023NR11QQ, OU=CPS - www.unipass.co.uk/cps, OU=Warning/Terms of Use - www.unipass.co.uk/tou, OU=EmployeeID01200012000003, OU=TPSP2, OU=BPNR1 1QQ, CN=Testt Orgg/emailAddress=fname.lastname@aviva.co.uk");
            xmlRequestWriter.WriteEndElement();
            xmlRequestWriter.WriteEndElement();
            xmlRequestWriter.WriteElementString("os:responder_id", "os:responder_id");
            xmlRequestWriter.WriteEndElement();



            xmlRequestWriter.WriteStartElement("ce:m_content");
            xmlRequestWriter.WriteStartElement("ce:b_control");
            xmlRequestWriter.WriteElementString("ce:contract_enquiry_reference", "TestRequest");
            xmlRequestWriter.WriteEndElement();
            xmlRequestWriter.WriteStartElement("ce:intermediary");
            xmlRequestWriter.WriteStartElement("ce:FirmFSARef");
            xmlRequestWriter.WriteElementString("id", "456123");//="idvalue14">
            xmlRequestWriter.WriteEndElement();
            xmlRequestWriter.WriteEndElement();
            xmlRequestWriter.WriteStartElement("ce:request_scope");
            xmlRequestWriter.WriteElementString("ce:contract_details_required_ind", "Yes");
            xmlRequestWriter.WriteElementString("ce:valuation_currency", "GBP");
            xmlRequestWriter.WriteElementString("ce:fund_code_type_required", "SEDOL");
            xmlRequestWriter.WriteStartElement("ce:valuation_request");
            xmlRequestWriter.WriteElementString("ce:type", "Current");//"ce:type","Current"
            xmlRequestWriter.WriteEndElement();
            xmlRequestWriter.WriteEndElement();
            xmlRequestWriter.WriteStartElement("ce:contract");
            xmlRequestWriter.WriteElementString("ce:contract_reference_number", "PP12345678");
            xmlRequestWriter.WriteEndElement();
            xmlRequestWriter.WriteEndElement();
            xmlRequestWriter.WriteEndElement(); 

            xmlRequestWriter.WriteEndElement();
            xmlRequestWriter.WriteEndDocument();
            xmlRequestWriter.Flush();

上記のコードを使用して、リクエストを送信し、WCF サービスからレスポンスを受信する方法を教えてください。

wsdl 参照を追加しましたが、以下の行で XmlElement[] を渡す方法がわかりません。

serviceReference.getDetail(ref XmlElement[] Any);

これは Reference クラスのメソッドです。

   [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(Namespace="http://www.domainname.com/whatever/webname/schema/ce/v2.2/NameContractServic" +
        "e", ConfigurationName="TestingPension.NameContractServiceDetailType")]
    public interface NameContractServiceDetailType {

        // CODEGEN: Generating message contract since the wrapper namespace (http://www.domainname.com/schema/ce/v2.2/NameContractRequest) of message getDetailRequest does not match the default value (http://www.domainname.com/name/name/schema/ce/v2.2/NameContractService)
        [System.ServiceModel.OperationContractAttribute(Action="http://www.origostandards.com/schema/ce/v2.2/CEPensionSingleContract#getDetail", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(SoapReqResWebApplication.TestingPension.Error[]), Action="http://www.domainname.com/schema/ce/v2.2/NameContract#getDetail", Name="errors", Namespace="http://www.domainname.com/schema/tech/v1.0/SOAPFaultDetail")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        SoapReqResWebApplication.TestingPension.getDetailResponse getDetail(SoapReqResWebApplication.TestingPension.getDetailRequest request);
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="message", WrapperNamespace="http://www.domainname.com/schema/ce/v2.2/NameContractRequest", IsWrapped=true)]
    public partial class getDetailRequest {

        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=0)]
        [System.Xml.Serialization.XmlAnyElementAttribute()]
        public System.Xml.XmlElement[] Any;

        public getDetailRequest() {
        }

        public getDetailRequest(System.Xml.XmlElement[] Any) {
            this.Any = Any;
        }
    }

@CodeCaster私はあなたのコードを次のように試しました: var documentToSend = new XmlDocument(); //// TODO:
使用するすべての要素を追加します (XmlTextWriter xmlRequestWriter = new XmlTextWriter(@"C:/Unipass/Request.xml", Encoding.UTF8)) { xmlRequestWriter.WriteStartDocument(); xmlRequestWriter.WriteStartElement("ce:メッセージ"); xmlRequestWriter.WriteEndElement(); xmlRequestWriter.WriteEndDocument(); xmlRequestWriter.Flush(); documentToSend.Save(xmlRequestWriter); //// ルート メッセージ ノードのみを要素とする配列を作成します。var xmlToSend = new XmlElement[] { documentToSend.DocumentElement }; //xmlToSend = null
xmlToSend が null である理由を教えてください。

4

2 に答える 2

1

メッセージをSOAP/XMLにシリアライズするコードを手作業で書いているようです。SOAP リクエストの例は、WSDL ではなく実際のインスタンス ドキュメントです。これは、WCF が行うことの 1 つです。独自の SOAP メッセージを生成する必要はありません。

WCF では、送信するオブジェクトの種類とサポートする操作に焦点を当てます。次に、WCF が SOAP シリアル化の面倒な作業をすべて行います。それが本当にWCFの要点です。

サンプルの SOAP メッセージから正確に何をしようとしているのかを解読するのは非常に難しいので、ここからの簡単な WCF サンプルの 1 つを見ることをお勧めします。

http://msdn.microsoft.com/en-us/library/vstudio/ms751514(v=vs.90).aspx

wsHttpBinding または basicHttpBinding (これらは WCF の SOAP バインディングです) を使用して、単純なものを起動して実行します。次に、Fiddler などを使用して HTTP 要求をキャプチャし、SOAP エンベロープの生成に関して WCF が行ったことを確認します。

その後、それを自分のケースに翻訳できるはずです。

于 2013-09-25T11:27:39.477 に答える
0

生成されたメソッド シグネチャがgetDetailRequest(System.Xml.XmlElement[] Any). SoapUIのようなツールは WSDL について何と言っていますか?

これを解決する方法は、実際に<ce:message>..</ce:message>ブロックであるメッセージを手動で生成することです。サービス メソッドを呼び出すと、WCF はそれを適切な SOAP エンベロープにラップします。

クラスを少しいじる必要がありますが、次のXmlDocumentようなものでうまくいくと思います。

// Create an XmlDocument and fill it
var documentToSend = new XmlDocument();

// TODO: add all elements you like

// Create an array with the root message node as only element.
var xmlToSend = new XmlElement[] { documentToSend.DocumentElement };

// Call the service.
var response = serviceReference.getDetail(xmlToSend);

もう 1 つの方法は、C# で要求クラスを手動で再作成し、要求を送信するときにそのインスタンスを XML に入力してシリアル化することです。最終的な方法は、サービス参照の追加 (SvcUtil) がサービスのメタデータからクラスを生成できるように XML を修正することです。

編集に関しては、XML 要素を に書き込むのではなくdocumentToSend、ファイルに書き込みます。

于 2013-09-25T10:44:02.583 に答える