Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用HttpRequestException获取失败请求的响应正文_C#_.net_Httpclient - Fatal编程技术网

C# 使用HttpRequestException获取失败请求的响应正文

C# 使用HttpRequestException获取失败请求的响应正文,c#,.net,httpclient,C#,.net,Httpclient,我正在尝试记录来自我的HttpRequestException的失败请求 我的服务器在响应体返回错误代码和额外的JSON负载。我需要访问JSON。如果请求出错,如何读取响应正文?我知道实际的响应不是空的。这是一个API,我确认它返回带有4xx状态代码的JSON负载,提供了有关错误的详细信息 如何访问它?这是我的密码: using (var httpClient = new HttpClient()) { try { string resultString = aw

我正在尝试记录来自我的
HttpRequestException
的失败请求

我的服务器在响应体返回错误代码和额外的JSON负载。我需要访问JSON。如果请求出错,如何读取响应正文?我知道实际的响应不是空的。这是一个API,我确认它返回带有4xx状态代码的JSON负载,提供了有关错误的详细信息

如何访问它?这是我的密码:

using (var httpClient = new HttpClient())
{
    try
    {
        string resultString = await httpClient.GetStringAsync(endpoint);
        var result = JsonConvert.DeserializeObject<...>(resultString);
        return result;
    }
    catch (HttpRequestException ex)
    {
        throw ex;
    }
}
使用(var httpClient=new httpClient())
{
尝试
{
string resultString=await httpClient.GetStringAsync(端点);
var result=JsonConvert.DeserializeObject(resultString);
返回结果;
}
捕获(HttpRequestException-ex)
{
掷骰子;
}
}

我试图在
throw ex
行中获取数据,但找不到方法。

基本上是@RyanGunn发布但在代码中实现的内容

您应该能够从
resultString.Content

我正在开发一个SDK,它使用类似的代码,除了我们使用switch语句来检查我们打算在
反序列化对象
行之前返回的各种
HttpStatusCodes

using (var httpClient = new HttpClient())
{
    try
    {
        string resultString = await httpClient.GetStringAsync(endpoint);
        var result = JsonConvert.DeserializeObject<...>(resultString.Content.ReadAsStringAsync().Result);
        return result;
    }
    catch (HttpRequestException ex)
    {
        throw ex;
    }
}
使用(var httpClient=new httpClient())
{
尝试
{
string resultString=await httpClient.GetStringAsync(端点);
var result=JsonConvert.DeserializeObject(resultString.Content.ReadAsStringAsync().result);
返回结果;
}
捕获(HttpRequestException-ex)
{
掷骰子;
}
}
使用而不是
GetStringAsync
GetAsync
不会引发异常,并允许您访问响应内容、状态代码和可能需要的任何其他标题


更多信息请参见此。

正如@Frédéric建议的那样,如果使用
GetAsync
方法,您将获得适当的
HttpResponseMessage
对象,该对象提供有关响应的更多信息。若要在发生错误时获取详细信息,您可以从响应内容中将错误反序列化为
异常
或自定义异常对象,如下所示:

public static Exception CreateExceptionFromResponseErrors(HttpResponseMessage response)
{
    var httpErrorObject = response.Content.ReadAsStringAsync().Result;

    // Create an anonymous object to use as the template for deserialization:
    var anonymousErrorObject =
        new { message = "", ModelState = new Dictionary<string, string[]>() };

    // Deserialize:
    var deserializedErrorObject =
        JsonConvert.DeserializeAnonymousType(httpErrorObject, anonymousErrorObject);

    // Now wrap into an exception which best fullfills the needs of your application:
    var ex = new Exception();

    // Sometimes, there may be Model Errors:
    if (deserializedErrorObject.ModelState != null)
    {
        var errors =
            deserializedErrorObject.ModelState
                                    .Select(kvp => string.Join(". ", kvp.Value));
        for (int i = 0; i < errors.Count(); i++)
        {
            // Wrap the errors up into the base Exception.Data Dictionary:
            ex.Data.Add(i, errors.ElementAt(i));
        }
    }
    // Othertimes, there may not be Model Errors:
    else
    {
        var error =
            JsonConvert.DeserializeObject<Dictionary<string, string>>(httpErrorObject);
        foreach (var kvp in error)
        {
            // Wrap the errors up into the base Exception.Data Dictionary:
            ex.Data.Add(kvp.Key, kvp.Value);
        }
    }
    return ex;
}

这篇文章详细介绍了如何处理HttpResponseMessage及其内容。

我不知道这是否对您有帮助。
        using (var client = new HttpClient())
        {
            var response =
                await client.GetAsync("http://localhost:51137/api/Account/Register");


            if (!response.IsSuccessStatusCode)
            {
                // Unwrap the response and throw as an Api Exception:
                var ex = CreateExceptionFromResponseErrors(response);
                throw ex;
            }
        }