【问题标题】:500 internal server error at GetResponse()GetResponse() 出现 500 内部服务器错误
【发布时间】:2011-05-05 04:17:07
【问题描述】:

我有一个流量很大的 aspx 页面,它会根据每个用户的请求调用 Web 服务,如下所示。

string uri = "Path.asmx";
string soap = "soap xml string";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Headers.Add("SOAPAction", "\"http://xxxxxx"");
request.ContentType = "text/xml;charset=\"utf-8\"";
request.Accept = "text/xml";
request.Method = "POST";

using (Stream stm = request.GetRequestStream())
{
    using (StreamWriter stmw = new StreamWriter(stm))
    {
        stmw.Write(soap);
    }
}
WebResponse response = request.GetResponse();
response.close();

一切正常,但有时我收到以下错误。

远程服务器返回错误:(500) 内部服务器错误。 在 System.Net.HttpWebRequest.GetResponse()

有没有人知道这个错误,或者任何人都可以告诉我我是否做错了。

【问题讨论】:

  • 如果它有时有效而其他无效,您需要发布失败的soap xml。那里有问题,而不是代码。

标签: c# .net asp.net web-services web-applications


【解决方案1】:

在我的例子中,我只是从 HttpWebRequest 对象中删除了 SoapAction 指令。所以,我没有在HttpWebRequest 定义中定义.Headers.Add("SOAPAction","someurl"),我的代码工作正常。

ResultXML 是一个XDocumentResultString 是一个字符串。

try
{
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Url);
    //req.Headers.Add("SOAPAction", "http://tempuri.org/IWebService/GetMessage");
    req.ProtocolVersion = HttpVersion.Version11;
    req.ContentType = "text/xml;charset=\"utf-8\"";
    req.Accept = "text/xml";
    req.KeepAlive = true;
    req.Method = "POST";        

    using (Stream stm = req.GetRequestStream())
    {
        using (StreamWriter stmw = new StreamWriter(stm))
            stmw.Write(soapStr);
    }
    using (StreamReader responseReader = new StreamReader(req.GetResponse().GetResponseStream()))
    {
        string result = responseReader.ReadToEnd();
        ResultXML = XDocument.Parse(result);
        ResultString = result;      
    }
}

【讨论】:

    【解决方案2】:

    对我来说,这个错误具有误导性。通过使用 SoapUI 测试错误的 Web 服务,我发现了真正的错误。

    【讨论】:

    • ...发现是..?
    • SteveCav:真正的错误几乎可以是任何东西:关键是使用 SoapUI 进行测试会产生真正的错误消息,而不是毫无意义的“内部服务器错误”。
    【解决方案3】:

    在我的例子中,我的请求对象继承自基础对象。在不知情的情况下,我添加了一个带有 int 的属性?在我的请求对象中,我的基础对象也具有与 int 数据类型相同的属性(相同的名称)。我注意到了这一点并删除了我在请求对象中添加的属性,之后它就可以正常工作了。

    【讨论】:

      【解决方案4】:

      首先查看您的错误消息,我建议您重新编译整个应用程序,确保重新编译时所有必需的 dll 都在 bin 文件夹中。

      【讨论】:

        【解决方案5】:

        从那个错误中,我会说你的代码很好,至少是调用 web 服务的部分。错误似乎在实际的 Web 服务中。

        要从 Web 服务器获取错误,请添加 try catch 并捕获 WebException。 WebException 有一个名为 Response 的属性,它是一个 HttpResponse。然后,您可以记录返回的任何内容,并上传您的代码。稍后再查看日志,看看实际返回了什么。

        【讨论】:

          【解决方案6】:

          对我来说,发生此错误是因为我有 2 个 Web API 操作具有完全相同的签名并且都具有相同的动词 HttpPost,我所做的是将其中一个动词(用于更新的动词)更改为 PUT并删除了错误。我的 catch 语句中的以下内容有助于找到问题的根源:

          catch (WebException webex)
          {
                          WebResponse errResp = webex.Response;
                          using (Stream respStream = errResp.GetResponseStream())
                          {
                              StreamReader reader = new StreamReader(respStream);
                              string text = reader.ReadToEnd();
                          }
          }
          

          【讨论】:

          • 这没有很好的记录,我花了很长时间才找到它。谢谢你的例子!
          • 发现这很有帮助。如果您打算保留它或需要读取来自 teamcity 或 CI 框的输出,请考虑更改为以下内容。 catch (WebException webException) { WebResponse webResponse = webException.Response;使用 (Stream responseStream = webResponse.GetResponseStream()) { if (responseStream == null) { throw; } StreamReader 阅读器 = 新 StreamReader(responseStream);字符串文本 = reader.ReadToEnd();抛出新的 WebException(文本,webException); } }
          • 谢谢!非常感谢
          • 就是这样,你摇滚。
          • 它确实告诉我哪一部分是异常的。谢谢你也指出来..
          【解决方案7】:

          您是否尝试为您的请求指定 UserAgent?例如:

          request.UserAgent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
          

          【讨论】:

          • 缺少 UserAgent 会导致很多具有动态内容的网站抛出错误。编写爬虫时的好建议,但不应使用 SOAP 或 REST api。
          【解决方案8】:

          最后,我使用以下代码摆脱了内部服务器错误消息。不确定是否有其他方法可以实现。

          
          string uri = "Path.asmx";
          string soap = "soap xml string";
          
          HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
          request.Headers.Add("SOAPAction", "\"http://xxxxxx"");
          request.ContentType = "text/xml;charset=\"utf-8\"";
          request.Accept = "text/xml";
          request.Method = "POST";
          
          using (Stream stm = request.GetRequestStream())
          {
              using (StreamWriter stmw = new StreamWriter(stm))
              {
                  stmw.Write(soap);
              }
          }
          
          using (WebResponse webResponse = request.GetResponse())
          {
          }
          
          

          【讨论】:

          • 使用是try-finally {dispose}。摆脱异常的好方法是使用 try-catch 忽略它。哈哈
          猜你喜欢
          • 1970-01-01
          • 2013-03-09
          • 2013-09-04
          • 2017-11-25
          • 2019-07-19
          • 1970-01-01
          • 2012-11-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多