gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:12:15 25 4
gpt4 key购买 nike

我正在尝试记录来 self 的 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;
}
}

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

最佳答案

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

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;
}

用法:

        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;
}
}

这是 source文章详细介绍了有关处理 HttpResponseMessage 及其内容的信息。

关于c# - 使用 HttpRequestException 获取失败请求的响应正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35588193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com