【发布时间】:2012-11-14 12:43:04
【问题描述】:
我正在向 ASMX Web 服务发出如下请求 -
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 ----------
我该如何解决?
【问题讨论】:
-
一个附带问题,但是:您正在向 ASMX Web 服务发出请求,但您没有使用它的 WSDL 来构建请求?为什么不?通常,如果您使用 WSDL,这些错误是完全可以避免的(前提是问题出在请求上,而不是服务本身)。
-
@Cloud:我不明白你的意思。如果您想知道我为什么这样做,那是因为我的客户端将是许多 Web 服务的通用客户端。它实际上是作为代理工作的。它将被赋予一个 Web 服务地址、方法名称和参数作为查询参数。然后它将使用这些参数向该方法发出请求。不过,在我提出请求之前,我正在获取 WSDL。有没有办法通过阅读 WSDL 来构建 SOAP Envelope?
-
有了这个解释,我可以理解您为什么要自己构建 SOAP 请求。你可以忽略我在这方面的评论。
-
您最好对所有需要引用的服务使用“添加服务引用”,然后使用反射查找生成的类和方法,并将参数传递给它们。我从来没有发现拥有这样一个“通用代理”很有用。你如何测试它?一般?
标签: asp.net web-services soap