Soap调用在c#中给出500(内部服务器错误)

use*_*231 4 c# soap

我有一个联盟帐户,我需要soap打电话来获取数据.我从一个站点获得了准备好的代码,我尝试应用它,但我得到了500(internal server error).我的代码如下.

public void getdata()
{
    var _url = "http://secure.directtrack.com/api/soap_affiliate.php";
    var _action = "http://secure.directtrack.com/api/soap_affiliate.php/dailyStatsInfo";

    XmlDocument soapEnvelopeXml = CreateSoapEnvelope();
    HttpWebRequest webRequest = CreateWebRequest(_url, _action);
    InsertSoapEnvelopeIntoWebRequest(soapEnvelopeXml, webRequest);

    // begin async call to web request.
    IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);

    // suspend this thread until call is complete. You might want to
    // do something usefull here like update your UI.
    asyncResult.AsyncWaitHandle.WaitOne();

    // get the response from the completed web request.
    string soapResult;
    using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult))
    using (StreamReader rd = new StreamReader(webResponse.GetResponseStream()))
    {
        soapResult = rd.ReadToEnd();
    }
    Console.Write(soapResult);

}

private static HttpWebRequest CreateWebRequest(string url, string action)
{
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
    webRequest.Headers.Add("SOAPAction", action);
    webRequest.ContentType = "text/xml;charset=\"utf-8\"";
    webRequest.Accept = "text/xml";
    webRequest.Method = "POST";
    return webRequest;
}

private static XmlDocument CreateSoapEnvelope()
{
    XmlDocument soapEnvelop = new XmlDocument();

    soapEnvelop.LoadXml(@"<SOAP-ENV:Envelope xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:xsi=""http://www.w3.org/1999/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/1999/XMLSchema""><SOAP-ENV:Body  xmlns=""http://soapinterop.org//"" SOAP-ENV:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/""> <q1:Execute xmlns:q1=""http://secure.directtrack.com/api/soap_affiliate.php/dailyStatsInfo""><client xsi:type=""xsd:string"">MyClientNAme</client><add_code xsi:type=""xsd:string"">MyCode</add_code><password xsi:type=""xsd:string"">MyPassword</password><program_id xsi:type=""xsd:int"">161</program_id></q1:Execute></SOAP-ENV:Body></SOAP-ENV:Envelope>");


    return soapEnvelop;
}

private static void InsertSoapEnvelopeIntoWebRequest(XmlDocument soapEnvelopeXml, HttpWebRequest webRequest)
{
    using (Stream stream = webRequest.GetRequestStream())
    {
        soapEnvelopeXml.Save(stream);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是什么?提前致谢.

JDB*_*JDB 5

内部服务器错误意味着错误在服务器端.您的代码可能正确地调用服务,或者您可能正在传递服务器不知道如何处理的参数(但服务器代码不够智能,无法告诉您).

如果不了解服务器及其预期的更多信息,则无法诊断问题.

也就是说,你的肥皂信封可能是个问题.您确定输入了正确的客户名称,添加代码,密码,程序ID等吗?


Tom*_*man 5

我也经历了这个,我什至可以告诉你这个代码在哪里:)

所以看看

webRequest.Headers.Add("SOAPAction", action);
Run Code Online (Sandbox Code Playgroud)

是问题

只需使用

webRequest.Headers.Add("SOAP:Action");
Run Code Online (Sandbox Code Playgroud)

  • 这似乎不符合 [规范](https://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383490)。我不是 SOAP 方面的专家,但似乎这与仅删除该标头具有相同的效果。 (2认同)

小智 -2

您确实应该尝试将代码包装在一个或多个 try-catch 块中,因为内部服务器错误可能是未处理的异常导致的。

如果soap xml 格式错误,此行将抛出 XmlException:

soapEnvelop.LoadXml(@"<SOAP-ENV:Envelope xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:xsi=""http://www.w3.org/1999/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/1999/XMLSchema""><SOAP-ENV:Body  xmlns=""http://soapinterop.org//"" SOAP-ENV:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/""> <q1:Execute xmlns:q1=""http://secure.directtrack.com/api/soap_affiliate.php/dailyStatsInfo""><client xsi:type=""xsd:string"">MyClientNAme</client><add_code xsi:type=""xsd:string"">MyCode</add_code><password xsi:type=""xsd:string"">MyPassword</password><program_id xsi:type=""xsd:int"">161</program_id></q1:Execute></SOAP-ENV:Body></SOAP-ENV:Envelope>");
Run Code Online (Sandbox Code Playgroud)

这可能会产生 IOExceptions:

soapEnvelopeXml.Save(stream);
Run Code Online (Sandbox Code Playgroud)

可能还有更多,但这应该给你一个正确的方向......