具有异步任务的 WCF Web 服务
WCF Web Service with Asynchronous task
我有一个 WCF 网络服务,它必须像这样:
- 外部调用
- 它returns 对输入数据进行基本验证后对客户端的响应
- 它启动一个异步任务,不能通知客户端。
客户端必须只在步骤2中收到响应,然后再没有别的。我认为这不是一个真正的异步网络服务,而是一个带有异步线程的同步网络服务。
我使用 .NET 4.0。
我可以使用什么技术?
如果您想在您的服务中使用 async/await,您将需要此处描述的异步泵:
Await, SynchronizationContext, and Console Apps: Part 3 by Stephen Toub
你不应该那样做。例如,如果您的 WCF 服务托管在 ASP.NET 中,那么 ASP.NET 将在没有未完成的请求时假定它 什么都不做 。因此,您的服务可以在您仍在工作时回收。
正确的架构是有一个单独的 "backend" 处理系统(例如,Azure WebJob 或 Win32 服务),并在 WCF 服务和后端服务(例如,Azure 队列或 MSMQ)。当 WCF 应用程序收到请求时,它会验证参数,在队列中弹出一条消息,然后 returns。后端服务独立从队列中读取请求并处理。
我有 a blog post 更详细,并描述了一些其他替代方法。
我有一个 WCF 网络服务,它必须像这样:
- 外部调用
- 它returns 对输入数据进行基本验证后对客户端的响应
- 它启动一个异步任务,不能通知客户端。
客户端必须只在步骤2中收到响应,然后再没有别的。我认为这不是一个真正的异步网络服务,而是一个带有异步线程的同步网络服务。
我使用 .NET 4.0。
我可以使用什么技术?
如果您想在您的服务中使用 async/await,您将需要此处描述的异步泵:
Await, SynchronizationContext, and Console Apps: Part 3 by Stephen Toub
你不应该那样做。例如,如果您的 WCF 服务托管在 ASP.NET 中,那么 ASP.NET 将在没有未完成的请求时假定它 什么都不做 。因此,您的服务可以在您仍在工作时回收。
正确的架构是有一个单独的 "backend" 处理系统(例如,Azure WebJob 或 Win32 服务),并在 WCF 服务和后端服务(例如,Azure 队列或 MSMQ)。当 WCF 应用程序收到请求时,它会验证参数,在队列中弹出一条消息,然后 returns。后端服务独立从队列中读取请求并处理。
我有 a blog post 更详细,并描述了一些其他替代方法。