开发者

.NET (C#) and RAW Soap Transactions

开发者 https://www.devze.com 2023-03-06 03:03 出处:网络
Recently I\'ve been experiencing a nightmare with .NET (C#) and SOAP Transmissions. I\'ve got to consume a webs开发者_JAVA技巧ervice (which was supposed to be an easy task) but it become terrible and

Recently I've been experiencing a nightmare with .NET (C#) and SOAP Transmissions. I've got to consume a webs开发者_JAVA技巧ervice (which was supposed to be an easy task) but it become terrible and nothing seem to works.

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;
}

When I try to sniff the packages by using Wireshark, that's what I get:

---- CLIENT INPUT ------
POST /apis/services/theapi HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
SOAPAction: ""
Accept: text/xml
Host: api.myapi.com

Connection: Keep-Alive

---- SERVER ANSWER ------

HTTP/1.1 500 Internal Server Error
Date: Sat, 14 May 2011 15:35:32 GMT
X-Powered-By: Servlet 2.4; JBoss-4.0.5.GA (build: CVSTag=Branch_4_0 date=200610162339)/Tomcat-5.5
Content-Type: text/xml;charset=ISO-8859-1
Content-Length: 225
Connection: close
X-Pad: avoid browser bug

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Client</faultcode><faultstring>Error reading XMLStreamReader.</faultstring></soap:Fault></soap:Body></soap:Envelope>

As expected, since I haven't posted a Soap Request (no XML in the request), I receive a SOAP Fault and ERROR 500.

Any ideas?

I've got to somehow do this manually. I've tried to use even TCPClient (to deal with it in a lower level), but all my attempts were frustrated.


You should use the VS Add Service Reference wizard to load the service into your project. The Add Service Reference generates classes to work with the api automatically at a much higher level, from the url of the service API endpoint. It will look something like this:

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

If you've done it correct, you shouldn't have to deal with HttpWebRequest, explicit URL's, or hand-typing out any SOAP XML at all!!

0

精彩评论

暂无评论...
验证码 换一张
取 消