.NET (C#) and RAW Soap Transactions

本文关键字:RAW Soap Transactions and NET | 更新日期: 2023-09-27 17:56:31

最近我一直在经历.NET(C#)和SOAP传输的噩梦。我必须使用网络服务(这应该是一件容易的事),但它变得很糟糕,似乎没有任何效果。

HttpWebRequest webRequest = (HttpWebRequest)System.Net.WebRequest.Create("http://api.myapi.com/apis/services/theapi");
webRequest.AllowAutoRedirect = true;
webRequest.Timeout = 1000 * 30;
webRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
webRequest.PreAuthenticate = true;
webRequest.Method = "POST";
webRequest.Headers.Add("SOAPAction: '"'"");
webRequest.Accept = "text/xml";
WebResponse webResponse = null;
try
{
    webResponse = webRequest.GetResponse();
    Stream Stream = webRequest.GetRequestStream();
    string SoapEnvelope = "<soap:Envelope>...SOAP CODE ...</soap:Envelope>";
    StreamReader streamReader = new StreamReader(webResponse.GetResponseStream(), System.Text.Encoding.UTF8);
    XmlDocument SoapEnvelopeXML = new XmlDocument();
    SoapEnvelopeXML.LoadXml(SoapEnvelope);
    SoapEnvelopeXML.Save(Stream);
    string result = streamReader.ReadToEnd();
    return result;
}

当我尝试使用Wireshark嗅探软件包时,这就是我得到的:

----客户端输入------POST/apis/services/theapi HTTP/1.1用户代理:Mozilla/4.0(兼容;微星 5.01;视窗NT 5.0)肥皂:"接受:文本/XML主持人:api.myapi.com连接:保持活动状态----服务器应答------HTTP/1.1 500 内部服务器错误日期:2011 年 5 月 14 日星期六 15:35:32 GMTX-Powered-by: Servlet 2.4;JBoss-4.0.5.GA(构建:CVSTag=Branch_4_0 date=200610162339)/Tomcat-5.5内容类型:文本/xml;字符集=ISO-8859-1内容长度:225连接:关闭X-Pad:避免浏览器错误<soap:信封><soap:Body><soap:Fault>soap:ClientError read XMLStreamReader.

正如预期的那样,由于我没有发布 SOAP 请求(请求中没有 XML),因此我收到 SOAP 错误和错误 500。

有什么想法吗?

我必须以某种方式手动执行此操作。我甚至尝试使用TCPClient(在较低级别处理它),但我所有的尝试都

.NET (C#) and RAW Soap Transactions

失败了。

应使用 VS 添加服务引用向导将服务加载到项目中。 "添加服务引用"会从服务 API 终结点的 URL 生成类,以便在更高级别自动使用 api。 它将看起来像这样:

MyApiClient client = new MyApiClient();
MyApiResult result;
try {
    client.Open();
    result = client.CallMethod(param1, param2, ...);
    client.Close();
} catch (Exception ex) {
    // do something with FaultException or API error
}
// do something with the result returned, if needed

如果你做得对了,你就不必处理HttpWebRequest、显式的 URL 或手动键入任何 SOAP XML!!