gpt4 book ai didi

c# - 从 SignalR 集线器发送异步邮件

转载 作者:太空狗 更新时间:2023-10-29 22:22:28 28 4
gpt4 key购买 nike

作为 SignalR 中心调用的结果,我需要发送电子邮件。我不希望发送同步执行,因为我不想绑定(bind) WebSocket 连接,但如果可能的话,我希望在出现任何错误时通知调用者。我认为我可以在集线器中使用类似的东西(减去错误处理和我希望它做的所有其他事情):

public class MyHub : Hub {
public async Task DoSomething() {
var client = new SmtpClient();
var message = new MailMessage(/* setup message here */);
await client.SendMailAsync(message);
}
}

但是很快发现不行; client.SendMailAsync 调用抛出这个:

System.InvalidOperationException: An asynchronous operation cannot be started at this time. Asynchronous operations may only be started within an asynchronous handler or module or during certain events in the Page lifecycle.

进一步的调查和阅读表明 SmtpClient.SendMailAsync 是围绕 EAP 方法的 TAP 包装器,而 SignalR 不允许这样做。

我的问题是,是否有任何简单的方法可以直接从 hub 方法异步发送电子邮件?

或者我唯一的选择是将电子邮件发送代码放在别处吗? (例如,让集线器排队服务总线消息,然后独立服务可以处理这些消息并发送电子邮件[尽管我也有更多的工作通过这种方式将结果通知回集线器的客户端];或让集线器向执行电子邮件发送的网络服务发出 HTTP 请求。

最佳答案

类似问题herehere .

SignalR 团队是 aware of the issue ,但还没有修好。此时它看起来会进入 SignalR v3。

与此同时,一个快速的 hack 是这样的:

public async Task DoSomething() {
using (new IgnoreSynchronizationContext())
{
var client = new SmtpClient();
var message = new MailMessage(/* setup message here */);
await client.SendMailAsync(message);
}
}

public sealed class IgnoreSynchronizationContext : IDisposable
{
private readonly SynchronizationContext _original;
public IgnoreSynchronizationContext()
{
_original = SynchronizationContext.Current;
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
}
public void Dispose()
{
SynchronizationContext.SetSynchronizationContext(_original);
}
}

关于c# - 从 SignalR 集线器发送异步邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24377081/

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