【问题标题】:C# SOAP call keeps returning 500 errorC# SOAP 调用不断返回 500 错误
【发布时间】:2017-01-17 10:13:43
【问题描述】:

在做了一些调查并阅读了几篇关于它的帖子,尤其是这篇文章之后:

我想出了以下代码:

RequestingXMLData = @"<?xml version=""1.0"" encoding=""UTF-8""?>
                    <soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:urn=""urn:iaso-com:cloud:mansvc:15.12.0"">
                        <soapenv:Header/>
                        <soapenv:Body>
                            <urn:Authenticate>
                                <request>
                                    <partnerName>XXX</partnerName>
                                    <userName>XXX</userName>
                                    <password>XXX</password>
                                </request>
                            </urn:Authenticate>
                        </soapenv:Body>
                    </soapenv:Envelope>";

//Retrieves XML Data from API link / service, optional to spit XML to a given file location
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(ApiCallPath);
request.Method = "POST";
request.ContentType = "text/xml;charset=\"utf-8\"";
request.ContentLength = RequestingXMLData.Length;
using (Stream webStream = request.GetRequestStream())
using (StreamWriter requestWriter = new StreamWriter(webStream, System.Text.Encoding.ASCII))
{
    requestWriter.Write(RequestingXMLData);
}

try
{
    WebResponse webResponse = request.GetResponse();
    using (Stream webStream = webResponse.GetResponseStream())
    {
        if (webStream != null)
        {
            using (StreamReader responseReader = new StreamReader(webStream))
            {
                response = responseReader.ReadToEnd();
            }
        }
    }
}
catch (WebException e)
{
    var resp = new StreamReader(e.Response.GetResponseStream()).ReadToEnd();

}

return response;

我在the WebResponse webResponse = request.GetResponse(); 部分不断收到 500 错误。

正如我在几篇文章中所建议的那样,我下载了 Fiddler,我从中得到的响应看起来不错(虽然没有经验,所以我可能会离开):

Request Count:   1
Bytes Sent:      85     (headers:85; body:0)
Bytes Received:  107        (headers:107; body:0)
Tunnel Sent:     1.740
Tunnel Received: 4.900

ACTUAL PERFORMANCE
--------------
ClientConnected:    11:03:28.895
ClientBeginRequest: 11:03:28.900
GotRequestHeaders:  11:03:28.900
ClientDoneRequest:  11:03:28.901
Determine Gateway:  0ms
DNS Lookup:         0ms
TCP/IP Connect: 12ms
HTTPS Handshake:    0ms
ServerConnected:    11:03:28.916
FiddlerBeginRequest:    11:03:28.916
ServerGotRequest:   11:03:28.916
ServerBeginResponse:    00:00:00.000
GotResponseHeaders: 00:00:00.000
ServerDoneResponse: 00:00:00.000
ClientBeginResponse:    11:03:28.917
ClientDoneResponse: 11:03:28.917

    Overall Elapsed:    0:00:00.017

RESPONSE BYTES (by Content-Type)
--------------
~headers~: 107

接下来我尝试检索 WebException,这就是它返回的内容:

我还在 SOAP UI 中对其进行了测试,它似乎可以工作 - 在修复 Java 错误之后(因此验证数据也是正确的)。

一些附加信息:

请记住,我以前从未使用 SOAP 做过任何事情,所以如果问题看起来很明显,我深表歉意 :)

【问题讨论】:

  • new StreamWriter(webStream, System.Text.Encoding.ASCII)) 试试System.Text.Encoding.UTF8
  • 更改后我在更改部分遇到异常using (StreamWriter requestWriter = new StreamWriter(webStream, System.Text.Encoding.UTF8)) 异常:The request was aborted: The request was canceled.
  • 嗯,这很奇怪。让我再检查一遍
  • 可能是调用 SOAP XML 的问题?将测试这篇文章中给出的答案:stackoverflow.com/questions/14499006/… BTW 愚蠢,我错过了 ASCII 编码;)
  • 嗯,也可能是保活问题。异常是立即引发还是需要一些时间(几秒钟)? stackoverflow.com/questions/2459241/…

标签: c# web-services soap


【解决方案1】:

首先你说:

 request.ContentType = "text/xml;charset=\"utf-8\"";

翻译:嘿,我有一条消息,它是 XML 和 UTF8 字节编码的形式。

然后你就偷偷摸摸做:

using (StreamWriter requestWriter = 
            new StreamWriter(webStream, System.Text.Encoding.ASCII))

翻译:经过一些黑暗古老的神秘(粘土)石板,包含一些ASCII。

所以,坚持你的承诺并使用:

using (StreamWriter requestWriter = 
            new StreamWriter(webStream, System.Text.Encoding.UTF8))

顺便说一句,当您在处理基于 XML 的事情(例如 soap,甚至是 html)时,UTF8 是一种选择。

至于中止的异常,您的连接似乎已被提前处理。 您可能想尝试将您的 try 语句放在 using 块中:

HttpWebRequest request = (HttpWebRequest) WebRequest.Create("")

request.Method = "POST";
request.ContentType = "text/xml;charset=\"utf-8\"";
request.ContentLength = RequestingXMLData.Length;
using (Stream webStream = request.GetRequestStream())
using (StreamWriter requestWriter = new StreamWriter(webStream, System.Text.Encoding.UTF8))
{
   requestWriter.Write(RequestingXMLData);

   try
   {
       WebResponse webResponse = request.GetResponse();
       using (Stream webStream = webResponse.GetResponseStream())
       {
            if (webStream != null)
            {
                 using (StreamReader responseReader = new StreamReader(webStream))
                 {
                     response = responseReader.ReadToEnd();
                 }
             }
       }
   }
   catch (WebException e)
   {
        var resp = new StreamReader(e.Response.GetResponseStream()).ReadToEnd();

   }
}

【讨论】:

  • 将我的代码修改为您上次更新的代码部分时,它会返回几个其他错误。 using (Stream webStream = webResponse.GetResponseStream()) 的 webstream 不能在此范围内声明,因为它会给“webstream”赋予不同的含义。将其更改为“webstream2”时会出现错误:You must write ContentLength bytes to the request stream before calling [Begin]GetResponse.
猜你喜欢
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
相关资源
最近更新 更多