这样做的正确方法是使用基于队列的通信。原因是可扩展性。你想让你的服务的“实例”接收请求,并且你希望“一个实例”将结果返回给客户端吗?
您可以快速浏览一下我的关于AppFabric Queues的博客文章,但它们太笨重了。下面是如何I'do它:
创建WorkerRequest类,看起来像这样
public class WorkerRequest {
string clientId;
MyTaskEnum taskToPerform;
}
写入队列存储,(在我的生产代码,我使用的是我还没有博客的包装关于然而,但计划:)),添加请求。
有一个工作线程监听这个队列,并且当收到一个请求时,产生一个新的线程来完成它。完成后,使用您的任务&客户端ID作为您的密钥,写入表存储。这样,你可以随时检查状态(简单/ GET /请求表)+你已经解除了&可扩展性已经解决。
希望它有帮助。
UPDATE:想解释一点,所以我决定更新帖子=)
您可以在“Web角色”,这是我会做什么创建一个WCF Web服务。我前一段时间是blogged about。在同一个角色中,您创建一个工作人员。你通过实施RoleEntryPoint
的课程来达到这个目的。这个类(位于Microsoft.WindowsAzure.ServiceRuntime)的样子:
public abstract class RoleEntryPoint
{
public virtual bool OnStart()
{
return true;
}
public virtual void Run()
{
Thread.Sleep(-1);
}
public virtual void OnStop()
{
}
}
您简单地实现在运行一段时间(true)循环,询问队列是否有用于处理任何新的消息。当收到这样的消息不会产生一个新的,只是处理它。如果您想缩放它,可以通过添加新实例进行缩放。显然,这可能是昂贵的,所以实际上产生新线程是明智的,但仅限于某个极限,例如,最多5个线程。如果池中没有线程,则将消息返回队列(当您完成消息时,您需要调用Complete()
,否则它不一定会被删除)。它会在稍后或另一名工作人员中被拾起。
因此,当工作线程完成时,将结果写入表存储并完成。
+1两个答案 - 同一个想法在同一时间。在极端情况下 - 客户端和服务器之间需要真正紧密的耦合 - 那么您也可以使用粘滞会话模式 - http://dunnry.com/blog/2010/10/14/StickyHTTPSessionRoutingInWindowsAzure.aspx - 但这不适用于简单情况下(IMO) – Stuart
我必须诚实地说,马丁巴比我快了4秒。 –
表存储/ appfabric缓存的使用是诱人的,并会简化大部分的轮询。但大卫斯蒂尔建议的工作者角色听起来也很有趣... –