【问题标题】:How to process WebResponse when .NET throws WebException ((400) Bad Request)?当.NET抛出WebException((400)错误请求)时如何处理WebResponse?
【发布时间】:2011-09-30 10:38:53
【问题描述】:

我正在使用 Facebook Graph Api 并尝试获取用户数据。我正在发送用户访问令牌,如果此令牌已过期或无效,Facebook 将返回状态代码 400 和此响应:

{
    "error": {
        "message": "Error validating access token: The session is invalid because the user logged out.",
        "type": "OAuthException"
    }
}

问题是当我使用这个 C# 代码时:

try {
   webResponse = webRequest.GetResponse(); // in case of status code 400 .NET throws WebException here
} catch (WebException ex) {
}

如果状态码是 400 .NET 抛出 WebException 并且我的webResponsenull 在异常被捕获之后所以我没有机会处理它。我想这样做以确保问题出在过期的令牌中,而不是其他地方。

有办法吗?

谢谢。

【问题讨论】:

    标签: c# asp.net facebook exception httpwebresponse


    【解决方案1】:

    使用这样的 try/catch 块并适当地处理错误消息应该可以正常工作:

        var request = (HttpWebRequest)WebRequest.Create(address);
        try {
            using (var response = request.GetResponse() as HttpWebResponse) {
                if (request.HaveResponse && response != null) {
                    using (var reader = new StreamReader(response.GetResponseStream())) {
                        string result = reader.ReadToEnd();
                    }
                }
            }
        }
        catch (WebException wex) {
            if (wex.Response != null) {
                using (var errorResponse = (HttpWebResponse)wex.Response) {
                    using (var reader = new StreamReader(errorResponse.GetResponseStream())) {
                        string error = reader.ReadToEnd();
                        //TODO: use JSON.net to parse this string and look at the error message
                    }
                }
            }
        }
    }
    

    但是,使用Facebook C# SDK 使这一切变得非常容易,因此您不必自己处理。

    【讨论】:

    • 感谢您的详细回答,我已经以类似的方式完成了。我知道我可以使用 Facebook SDK,但与 Google 或 Twitter 相比,使用 Facebook api 相对容易,所以我决定在这里手动完成所有操作以了解流程并获得更多控制权。
    • 任何人都知道为什么 WebException --> errorResponse.GetResponseStream() 在 Silverlight 中为空?不过我可以在 Fiddler 中看到 body 响应。
    • 对我来说也是空的。做一点挖掘。在普通 .net 中编译时,这可以按预期工作。
    • WebException->errorResponse 丢失的问题似乎来自using 块。按照这个How to Answer (stackoverflow.com/a/1887407/1547089) 中给出的建议,如果你只是在流周围使用using 块,你不会丢失errorResponse。
    【解决方案2】:

    WebExceptionResponse 属性中仍然具有“真实”响应(假设有响应),因此您可以从catch 块中获取数据。

    【讨论】:

    • 感谢 Jon,尝试访问那里的 Response 属性是个好主意吗?如果我在catch 块内遇到异常会发生什么?我应该把我的try and catch 放在另一个try and catch 里面吗?
    • @Burjua:访问该属性不会给您一个例外 - 毕竟,这就是它的用途。我相信响应已经包含所有响应数据,因此如果您设法获取响应流,读取响应流本身应该是安全的。
    猜你喜欢
    • 2013-09-11
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    相关资源
    最近更新 更多