从System.Net.WebRequest获取完整的响应正文

时间:2015-08-23 13:12:30

标签: c# webrequest httpwebresponse

我正在使用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.并且没有InnerException,并且我没有其他任何东西可以从异常中受益。

[答案] @Rene指出了正确的方向,可以像这样获得正确的反应体:

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

1 个答案:

答案 0 :(得分:4)

您正在捕捉常规异常,因此没有太多空间可以获取具体信息。

你应该抓住几个webrequest类抛出的specialized exception,即WebException

你的捕获代码可能是这样的:

Items

WebException个实例中,您还可以访问来自主机的Response发送内容,以便您可以访问发送给您的任何内容。