web-dev-qa-db-ja.com

C#を使用して要求と応答を送信/受信する方法SOAP?

_private static string WebServiceCall(string methodName)        
{
    WebRequest webRequest = WebRequest.Create("http://localhost/AccountSvc/DataInquiry.asmx");
    HttpWebRequest httpRequest = (HttpWebRequest)webRequest;             
    httpRequest.Method = "POST";             
    httpRequest.ContentType = "text/xml; charset=utf-8";
    httpRequest.Headers.Add("SOAPAction: http://tempuri.org/" + methodName);
    httpRequest.ProtocolVersion = HttpVersion.Version11;
    httpRequest.Credentials = CredentialCache.DefaultCredentials;
    Stream requestStream = httpRequest.GetRequestStream();              
    //Create Stream and Complete Request             
    StreamWriter streamWriter = new StreamWriter(requestStream, Encoding.ASCII);

    StringBuilder soapRequest = new StringBuilder("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"");
    soapRequest.Append(" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" ");
    soapRequest.Append("xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body>");
    soapRequest.Append("<GetMyName xmlns=\"http://tempuri.org/\"><name>Sam</name></GetMyName>");
    soapRequest.Append("</soap:Body></soap:Envelope>");

    streamWriter.Write(soapRequest.ToString());             
    streamWriter.Close();              
    //Get the Response    
    HttpWebResponse wr = (HttpWebResponse)httpRequest.GetResponse();
    StreamReader srd = new StreamReader(wr.GetResponseStream()); 
    string resulXmlFromWebService = srd.ReadToEnd(); 
    return resulXmlFromWebService;
}
_

Soap応答を送受信するために別のコードを試しましたが、すべて同じ"The remote server returned an error: (500) Internal Server Error."で失敗します。

SoapUIを使用して同じサービスにアクセスできます。メソッドも呼び出すことができます。このフォーラムで、500エラーが表示される理由は間違ったヘッダーである可能性があることを読みました。ヘッダーを確認しましたが、問題ないようです。誰か助けていただければ幸いです。

以下はサンプルですSOAP request:

_POST /AccountSvc/DataInquiry.asmx HTTP/1.1
Host: abc.def.gh.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/GetMyName"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetMyName xmlns="http://tempuri.org/">
      <name>string</name>
    </GetMyName>
  </soap:Body>
</soap:Envelope>
_

上記のサンプルリクエストを使用してメソッドを実行し、動作しました。これが、私が渡したSoapリクエストです。

_<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><GetMyName xmlns="http://tempuri.org/"><name>Sam</name></GetMyName></soap:Body></soap:Envelope>
_

編集:

.asmxサービスで機能するWebServiceCallの上記のコードを更新しました。しかし、同じコードはWCFサービスでは機能しませんでした。どうして?

22
Sri Reddy

RLは異なります。

  • http://localhost/AccountSvc/DataInquiry.asmx

vs.

  • /acctinqsvc/portfolioinquiry.asmx

WebサーバーがPOSTにしようとしているURLを解決できない場合、リクエストで説明されているアクションの処理を開始することさえできないように、最初にこの問題を解決します。

ASMXルートURLへのWebRequest、つまりhttp://localhost/AccountSvc/DataInquiry.asmxのみを作成し、SOAPActionヘッダーで目的のメソッド/操作を指定する必要があります。

SOAPActionヘッダーの値は異なります。

  • http://localhost/AccountSvc/DataInquiry.asmx/ + methodName

vs.

  • http://tempuri.org/GetMyName

正しいASMX URLに移動して?wsdlを追加することにより、正しいSOAPActionを決定できるはずです。

実行しようとしている操作に一致する<soap:operation>タグの下に<wsdl:operation>タグがあります。これはGetMyNameのように見えます。

SOAP XML。を含む要求本文にXML宣言はありません。)==

HttpRequestのContentTypeでtext/xmlを指定し、文字セットは指定しません。おそらくこれらはus-asciiにデフォルト設定されていますが、それらを指定していないかどうかはわかりません!

SoapUIで作成されたXMLには、utf-8のエンコーディングを指定するXML宣言が含まれています。これは、HTTPリクエストに提供されるContent-Typeとも一致します:text/xml; charset=utf-8

お役に立てば幸いです!

21
rrhartjr