- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我似乎无法捕获从 System.Net.Http.HttpClient 的 SendAsync 方法抛出的某些异常。具体来说,是从 HttpWebRequest.ChechProtocol 方法抛出的 ProtocolViolationException。代码似乎死锁或挂起,并且从未输入 catch。
我已经创建了一个 NUnit 单元测试来清楚地说明这个问题。
public class TestClass
{
public bool TestProperty { get; set; }
}
[Test]
public async Task CanCatchExceptionFromHttpClientSendAsync()
{
var caughtException = false;
try
{
var request = new HttpRequestMessage(HttpMethod.Get, "http://somedomain.com")
{
Content = new ObjectContent<TestClass>(
new TestClass { TestProperty = true },
new JsonMediaTypeFormatter())
};
await new HttpClient().SendAsync(request);
}
catch (Exception)
{
caughtException = true;
}
Assert.IsTrue(caughtException);
}
使用 StringContent 而不是 ObjectContent 测试通过。我错过了一些简单的东西吗?
更新
基于 StringContent 允许捕获异常和 ObjectContent 死锁这一事实,我已经能够推断出这在某种程度上与 MediaTypeFormatter 的 WriteToStreamAsync 方法有关。
我已经设法通过将内容“预格式化”到 ByteArrayContent 来解决这个问题,如下所示:
private static async Task<HttpContent> CreateContent<T>(
T value,
string mediaType,
MediaTypeFormatter formatter)
{
var type = typeof(T);
var header = new MediaTypeHeaderValue(mediaType);
HttpContent content;
using (var stream = new MemoryStream())
{
await formatter.WriteToStreamAsync(type, value, stream, null, null);
content = new ByteArrayContent(stream.ToArray());
}
formatter.SetDefaultContentHeaders(type, content.Headers, header);
return content;
}
然后像这样消费它:
var content = await CreateContent(
new TestClass(),
"application/json",
new JsonMediaTypeFormatter());
var request = new HttpRequestMessage(HttpMethod.Get, "http://foo.com")
{
Content = content
};
这至少可以让捕获正常工作,但我
最佳答案
这是 HttpClient 中的一个已知错误。您可以通过自己缓冲、设置内容长度(如 ByteArrayContent 所做的那样)或使用分块传输编码(如果您的平台支持,但手机不支持)来解决此问题。
关于c# - 为什么在使用 ObjectContent 时无法从 HttpClient SendAsync 捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23547814/
我有一个使用 *Async 方法(如 SendAsync)通过套接字进行通信的应用程序。我在执行 SendAsync 但未通过网络发送数据时遇到这种奇怪的行为。 我已启用网络跟踪并获得以下日志: Sy
我编写了一个小 winforms 应用程序,它向本地网络中的每个 IP 地址发送 http 请求,以发现我的某个设备。在我的特定子网掩码上,有 512 个地址。我已经使用 backGroundWork
我一直在关注this VSTF_RD_Bot example code . 我无法构建此代码,因为我收到以下消息: The type arguments for method 'Conversatio
如以下简化代码所示,检查 SendAsync() 是否已完成缓冲区中所有预期字节的传输是正确的做法吗?还是那是多余的?这是一个 TCP 连接套接字。我特别担心必须在 ProcessSend() 中发出
在使用 SendAsync 时处理 SmtpClient 和 MailMessage 的正确方法是什么? 我已经在下面复制了我的代码。 { ... var client = new SmtpClien
我正在使用 SendAsync 方法循环发送 1000 条消息,并在这行代码中得到下面的异常 await _ws.SendAsync(new ArraySegment(messageBuffer, o
In asp.net - using Message Handlers - 我可以通过添加消息处理程序来自定义请求/响应。 因此,一个请求进入,通过多个消息处理程序,然后响应通过相同的处理程序(在相反
我正在调用以下函数来获取访问 token ,以便使用 REST Api 检索 Twitter 用户个人资料。 public async Task GetAccessToken() {
我刚刚编写了一些测试代码来查看 System.Net.Mail.SmtpClient 向我自己发送相同的消息。 int numClients = 10; List mailClients = new
我正在尝试使用 Atomix 在 Java 的两个进程之间发送消息和 Netty 。我有一个名为 Starter 的程序,它负责向所有正在等待该消息的正在运行的进程发送消息。 这是入门版: Addre
我正在尝试用 C# 构建一个小型应用程序,以从 Microsoft Graph API 检索建议的 session 时间。身份验证后,我调用 graphClient.HttpProvider.Send
我正在尝试编写一个辅助类来在我的 C# 应用程序中发送电子邮件。我想使用 SmtpClient.SendAsync,但显然我不了解异步的工作原理或者我设置了错误: public class Email
在我的应用程序中,我使用 Dataflow 库中的 ActionBlock,使用 SmtpClient.SendAsync() 发送电子邮件警报方法,它不会阻止调用线程。(ActionBlock 从
应用程序要求使用 SendAsync 而不仅仅是发送。所以我制作了一个 CEmailServer 类并设置了所有内容。到目前为止, Send 工作正常,但是当将其更改为与 SendAsync 一起使用
我有一个 Websocket HTTPListener 作为服务器,客户端是 WebSocket的 我将所有当前客户端保存在一个列表中,我想要一个向所有客户端异步发送信息的函数。 所以我目前拥有的是:
我正在尝试优化一个 tcp 套接字包装器,它在处理大量入站连接时遇到了困难。我正在一个基本的聊天服务器和一个小型客户端应用程序中测试它以将客户端发送给它。这两个应用程序都位于通过千兆交换机连接的单独
我正在尝试熟悉 smtp.SendAsync,但出于某种原因,我无法让邮件消息发送异步。 这是我试过的。 //smtp.SendAsync(mm, null)); Error, Async opera
我正在摆弄 Silverlight 的 TCP 通信,我被迫使用 System.Net.Sockets.Socket 类,它在 Silverlight 运行时只有异步方法。 我想知道如果两个线程在很短
我正在使用 .NET 4.0 的 ASP.NET Web API 客户端库(Microsoft.AspNet.WebApi.Client 版本 4.0.30506.0)。 我需要发送带有请求正文的 H
我有一个接口(interface),它有一个方法来创建队列客户端和消息工厂的实例。我已经创建了相同的具体实现,现在我正在尝试对用于将消息发送到队列的功能进行单元测试。我已经为相同的代码编写了以下代码:
我是一名优秀的程序员,十分优秀!