0

次のようにASMXWebサービスにリクエストを送信しています-

private HttpWebResponse SendSoap12Msg(string url, string method, 
                       Dictionary<string, string> KeyValue)
{
    StringBuilder SoapMessage = new StringBuilder();
    SoapMessage.Append("<?xml version='1.0' encoding='utf-8'?>");
    SoapMessage.Append(@"<soap12:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'");
    SoapMessage.Append(@" xmlns:xsd='http://www.w3.org/2001/XMLSchema'>");
    SoapMessage.Append(@" xmlns:soap12='http://www.w3.org/2003/05/soap-envelope'");
    //SoapMessage.Append(@" xmlns:soap12='http://schemas.xmlsoap.org/wsdl/soap12/'");
    SoapMessage.Append("<soap12:Body>");
    SoapMessage.Append("<");
    SoapMessage.Append(method);
    SoapMessage.Append(@" xmlns='http://tempurl.org/'>");

    foreach (KeyValuePair<string, string> kvp in KeyValue)
    {
        SoapMessage.Append("<");
        SoapMessage.Append(kvp.Key);
        SoapMessage.Append(">");
        SoapMessage.Append(kvp.Value);
        SoapMessage.Append("</");
        SoapMessage.Append(kvp.Key);
        SoapMessage.Append(">");
    }
    SoapMessage.Append("</");
    SoapMessage.Append(method);
    SoapMessage.Append(">");
    SoapMessage.Append("</soap12:Body>");
    SoapMessage.Append("</soap12:Envelope>");

    // Build HttpWebRequest
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));
    request.Method = "POST";
    request.ProtocolVersion = HttpVersion.Version11;
    request.ContentType = "application/soap+xml; charset=\"utf-8\"";
    //request.Accept = "application/soap+xml";

    // Send SOAP Envelope
    byte[] data = Encoding.UTF8.GetBytes(SoapMessage.ToString());
    request.ContentLength = data.Length;
    Stream requestStream = request.GetRequestStream();
    requestStream.Write(data, 0, data.Length);
    requestStream.Close();

    return (HttpWebResponse ) request.GetResponse();
}

ただし、リクエストが送信されるたびに500 - Internal Server Error、応答としてが返されます。これらを使用して、例外をさらに深く掘り下げます-

catch (WebException ex)
{
    Response.ContentType = "text/html";
    Response.Write("---------- Start: A WebException occured ----------<br />");
    Response.Write("Returned Content Type: " + ex.Response.ContentType); 
    Response.Write("<br />");
    Response.Write("Is From Cache: " + ex.Response.IsFromCache);
    Response.Write("<br />");
    Response.Write("Response URI: " + ex.Response.ResponseUri.ToString());
    Response.Write("<br />");
    Response.Write("ToString: " + ex.Response.ToString());
    Response.Write("<br />");
    Response.Write("ReadToEnd: " + 
            new StreamReader(ex.Response.GetResponseStream()).ReadToEnd()); 
    Response.Write("<br />");
    Response.Write("---------- End: A WebException occured ----------");
}

次の出力が得られます-

---------- Start: A WebException occured ----------
Returned Content Type: application/soap+xml; charset=utf-8
Is From Cache: False
Response URI: (the target uri, as expected)
ToString: System.Net.HttpWebResponse
ReadToEnd: soap:ReceiverServer was unable to process request. ---> 'soap12' is an undeclared prefix. Line 1, position 40.
---------- End: A WebException occured ----------

どうすれば解決できますか?

4

2 に答える 2

1

作成しているSOAPリクエストから欠落しているのは<request>、メソッド名の後、パラメーターの前のタグだけです。これを省略すると、このようなエラーが発生したり、WSエンティティへのリクエストの変換が失敗したりすることがあります。

次のことを試してください(簡潔にするためにいくつかのことを省略しています)。

SoapMessage.Append(String.Format(@"<{0} xmlns='http://tempurl.org/'>", method));
SoapMessage.Append("<request>");    // Line added

foreach (KeyValuePair<string, string> kvp in KeyValue)
{
    SoapMessage.Append(String.Format("<{0}>", kvp.Key));
    SoapMessage.Append(kvp.Value);
    SoapMessage.Append(String.Format("</{0}>", kvp.Key));
}

SoapMessage.Append("</request>");   // Line added
SoapMessage.Append(String.Format("</{0}>", method));

偶然にも、私は私たちのクライアントとこの問題に遭遇しました、そして、欠落したリクエストタグが原因でした。安全に省略できる場合もありますが、明らかに必須の場合もあります。また、コードの使用を追加しましたString.Format。これにより、コードが短くなり、理解しやすくなります。

編集: 私が見落としている他の唯一のことは、リクエストヘッダーにSOAPアクションを設定していることです。次の方法で追加できます。

request.Headers.Add("SOAPAction:", "http://tempurl.org/YourMethodname"); 
// You might need to try some variations. 
// Or replacing tempurl.org with the actual domain.

「C#HttpWebRequest SoapAction」をグーグルで検索すると、エラー500が発生する人がはるかに多くなります。特にリクエストで省略した場合。

また、あなたが試しているのとほぼ同じことをしているこのブログエントリも参照してください:http://mikehadlow.blogspot.nl/2006/05/making-raw-web-service-calls-with.html

于 2012-11-14T13:16:50.393 に答える
1

SOAP1.2のバインディングがweb.configに追加され、そのサービス用に構成され、有効になっていることを確認してください。

<wsdl:binding name="ServiceSoap12" type="tns:ServiceSoap">

その後

<configuration>
  <system.web>
    <webServices>
      <protocols>
        <add name="HttpSoap12"/>
      </protocols>
    </webServices>
  </system.web>
</configuration>
于 2012-11-14T13:12:21.133 に答える