【问题标题】:Getting full response body from System.Net.WebRequest从 System.Net.WebRequest 获取完整的响应正文
【发布时间】:2015-11-16 23:23:35
【问题描述】:

我正在使用 System.Net.WebRequest 从某些 API 获取信息。 当我收到错误时,响应仅包含基本的 HttpStatusCode 和消息,而不是返回的完整错误。 作为比较,在 POSTMAN 等工具中运行相同的帖子数据和标头将返回来自该 API 的完整错误。

我想知道是否有一些属性或方法可以获得完整的错误响应??

这是我正在运行的代码:

public HttpStatusCode GetRestResponse(
    string verb,
    string requestUrl,
    string userName,
    string password,
    out string receiveContent,
    string postContent = null)
{
    var request = (HttpWebRequest)WebRequest.Create(requestUrl);
    request.Method = verb;

    if (!string.IsNullOrEmpty(userName))
    {
        string authInfo = string.Format("{0}:{1}", userName, password);
        authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
        request.Headers.Add("Authorization", "Basic " + authInfo);
    }

    if (!string.IsNullOrEmpty(postContent))
    {
        byte[] byteArray = Encoding.UTF8.GetBytes(postContent);
        request.ContentType = "application/json; charset=utf-8";
        request.ContentLength = byteArray.Length;
        var dataStream = request.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();
    }

    try
    {
        using (WebResponse response = request.GetResponse())
        {
            var responseStream = response.GetResponseStream();
            if (responseStream != null)
            {
                var reader = new StreamReader(responseStream);
                receiveContent = reader.ReadToEnd();
                reader.Close();

                return ((HttpWebResponse) response).StatusCode;
            }
        }
    }
    catch (Exception ex)
    {
        receiveContent = string.Format("{0}\n{1}\nposted content = \n{2}", ex, ex.Message, postContent);
        return HttpStatusCode.BadRequest;
    }

    receiveContent = null;
    return 0;
}

当我生成一个向我显示错误的请求时,我收到错误消息:The remote server returned an error: (400) Bad Request. and no InnerException,并且我无法从异常中受益。

[Answer] @Rene 指向正确的方向,可以像这样获取正确的响应体:

var reader = new StreamReader(ex.Response.GetResponseStream());
var content = reader.ReadToEnd();

【问题讨论】:

    标签: c# webrequest httpwebresponse


    【解决方案1】:

    您正在捕获一般异常,因此没有太多空间用于特定信息。

    你应该捕捉到由几个 webrequest 类抛出的specialized exception,即WebException

    你的 catch 代码可能是这样的:

    catch (WebException e)
    {
        var response = ((HttpWebResponse)e.Response);
        var someheader = response.Headers["X-API-ERROR"];
        // check header
    
        if (e.Status == WebExceptionStatus.ProtocolError)
        {
            // protocol errors find the statuscode in the Response
            // the enum statuscode can be cast to an int.
            int code = (int) ((HttpWebResponse)e.Response).StatusCode;
            string content;
            using(var reader = new StreamReader(ex.Response.GetResponseStream()))
            {
                content = reader.ReadToEnd();
            }
            // do what ever you want to store and return to your callers
        }
    }
    

    WebException 实例中,您还可以访问主机发送的Response,因此您可以访问发送给您的任何内容。

    【讨论】:

    • 这实际上是我开始干预之前的问题。我仍然看不到我如何以这种方式获得特定于 API 的响应。我搜索了该对象并再次搜索,但找不到任何相关的内容
    • 我已经添加了如何检查其他内容。也许您可以分享邮递员展示的内容,以便我了解您在寻找什么。
    • 这是我在 POSTMAN 中得到的响应:pastebin.com/uDRDesd7,这是标题集合:pastebin.com/FVzd7kWS
    • 实际上,我尝试像这样阅读 ConnectStream:new StreamReader(((((HttpWebResponse)ex.Response))).m_ConnectStream).ReadToEnd(),它似乎可以解决问题。我马上更新
    • var reader = new StreamReader(ex.Response.GetResponseStream()); var content = reader.ReadToEnd(); 效果很好:) 谢谢!
    猜你喜欢
    • 2019-05-12
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    相关资源
    最近更新 更多