- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试记录来 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/
我在使用 HttpClient 时遇到问题,我不断收到 HttpRequestException occurred in mscorlib.dll。我已经从 SVN 下载了以前的工作版本,但我一直收到
不久前,我使用 HttpClient 类实现了一些代码来使用 REST Api。 using (var client = new HttpClient() { BaseAddress = new Ur
我在针对 Microsoft Team Foundation Cloud Service 运行的 Windows Server 2012 R2 上运行 Git 版本 2.12.1。无论我运行什么 Gi
我从一个 Web 应用程序发送 Exception 并在另一个 Web 应用程序中获取它。在这种情况下,如何从 HttpRequestException 获取值? 发送自: context.Respo
我有一个可以从网上下载大量 pdf 的应用程序。有时,我会收到 HttpRequestException,其中包含以下消息:将内容复制到流时出错。 所以,我正在尝试对我的代码进行单元测试以处理这种情况
这是一个让我感到困惑的一般性问题。我认为一旦发出 REST 请求,错误就会通过 WebException 返回。在一种情况下,我得到了一个 HttpRequestException,它不允许我获取 H
我正在尝试记录来 self 的 HttpRequestException 的失败请求。 我的服务器在响应正文中返回错误代码和额外的 JSON 负载。我需要访问那个 JSON。如果请求出错,我该如何读取
我在 Startup.ConfigureServices 方法中为我的 HttpClient 创建了一个重试策略。另请注意,默认情况下,asp.net core 2.1 会为 HttpClient 发
HttpResponseMessage.EnsureSuccessStatusCode()的使用模式是什么?它处理消息的内容并抛出 HttpRequestException,但我不知道如何以编程方式处
我有一个请求 URL 的 WebClient。我想在 UWP 应用程序中做同样的事情,我看到我必须导入 Microsoft.Net.Http 并使用 HttpClient。 所以我替换了这个(在类库中
目前我正在尝试模拟我的 Android 应用程序。开发的应用程序使用 xamarin.forms,适用于 Android 和 iOS。 我的问题是在使用 httpClient 进行 Restful 请
出于某种原因,当我尝试从我正在使用的 Web API 中获取 JSON 结果时,我在 Visual Studio 中收到了 403: Forbidden 异常。当我尝试在我的 Web 浏览器中使用 W
我可能在这里遗漏了一些明显的东西。 我正在使用 HttpClient,它会抛出消息字符串中包含 StatusCode 的 HttpRequestException。 我如何访问那个 StatusCod
我正在开发机器人解决方案,其中我正在进行 REST 调用以从其他服务器获取一些详细信息。 在本地主机中,我的代码工作正常,但在 Azure 中发布代码后,我收到以下错误: System.Net.Web
我有以下代码将文件上传到我的 Azure 存储: 读取文件流如下: FileStream fileStream = File.OpenRead(filePath); 并传递给函数=> publ
我们在 Azure 管道中使用 powershell 进行了云服务(经典)交换,该交换已运行一整年,由前员工设置,但现在失败并出现错误: Move-AzureDeployment : An error
出于某种原因,我收到了 HttpRequestException,其中包含消息“响应提前结束。我正在创建大约 500 个任务,这些任务使用我的 RateLimitedHttpClient 向网站发出请
我有一种情况,我必须在 catch 语句中提取 Response(HttpResponseMessage) 但我认为无法完成(使用 等待 在捕获中)。此外,如果我在 catch 之后执行此操作,Htt
突然间,这段通常有效的代码开始抛出 HttpRequestException 错误。在日志中,我看到请求实际上是在抛出错误之前 1 分 35 秒发送的。会不会是超时问题? 代码如下: private
我是 Bots 的新手,我注册了我的机器人,并尝试在模拟器 Microsoft Bot Framework Channel Emulator (3.0.0.59) 上运行它,我还在 Test conn
我是一名优秀的程序员,十分优秀!