【问题标题】:Handling The remote server returned an error: (500) Internal Server Error处理远程服务器返回错误:(500)内部服务器错误
【发布时间】:2013-07-19 15:48:20
【问题描述】:

我为我的应用程序创建了一个自定义 HTTP 类。这只是基本的,应用程序相当简单。反正有时候post方法会返回如下错误:

Handling The remote server returned an error: (500) Internal Server Error.

我的方法是

public String post(String url, String postData)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.UserAgent = this.userAgent;
        request.KeepAlive = false;
        request.ProtocolVersion = HttpVersion.Version10;
        request.CookieContainer = this.cookieJar;

        byte[] byteArray = Encoding.UTF8.GetBytes(postData);
        request.ContentLength = byteArray.Length;

        Stream stream = request.GetRequestStream();
        stream.Write(byteArray, 0, byteArray.Length);

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);

        String source = reader.ReadToEnd();

        return source;
    }

我正在发送更新我的 Facebook 状态的请求。大多数情况下它都能正常工作,偶尔也会出现异常并抛出异常。

捕获此异常以便我可以重试请求的最佳方法是什么?

【问题讨论】:

  • 调试方法。如果要解决此问题,您需要异常消息和堆栈跟踪。添加 try/catch 并记录异常信息。
  • 艾米,我该如何处理异常重试呢?如果我抓住它,那又怎样?我再试一次吗?如果我想重试请求 3 次怎么办?我认为这只是 Facebook 服务器响应错误的问题,因为 99% 的时间它都能正常工作。
  • 你确定这里发生了异常吗?只是问因为HttpWebResponse 包含StatusCode,我认为该错误更多是未能正确反应StatusCode 不是HttpStatusCode.OK 的事实...
  • 我知道错误是什么。修复它,这是一个应用程序问题。仍然想知道处理超出我控制范围的 HTTP 错误的最佳方法,因为这些错误在我开发网络爬虫时经常发生。我倾向于捕捉和忽略,但我不想这样做。

标签: c#


【解决方案1】:

重复请求可能不明智。在某些情况下,请求无法返回,但接收服务器可能已经处理了它,因此重试会导致重复。

如果您从这个 post 方法引发错误响应会更好 - 通过引发特定异常 - 然后由调用方法负责决定做什么。

它可以选择重复请求或忽略它,或者在尝试再次发送之前尝试验证它是否已收到。

【讨论】:

  • 听起来很合乎逻辑。我会试试看。