将Web应用程序订阅到NServiceBus中的活动

Loï*_*oïc 3 .net nservicebus

我想知道我的Web应用程序如何从服务器订阅事件?我知道Web应用程序不能发布事件.在异步示例中,是向服务器发送消息的Web应用程序.我希望应用程序SUBSCRIBE到服务器.在其他方面,如何处理来自Web应用程序的事件.我不知道如何编写Global.asax页面:public class Global:System.Web.HttpApplication和void Application_Start(object sender,EventArgs e)方法.谢谢,Loïc

Dav*_*ike 9

我不得不反对休.Web应用程序订阅其他服务发布的事件的原因非常正确.

通常,这不是您想要采取数据库操作的事情.一个主要的用例是用于缓存管理.使用评论中的UserCreated示例,Web应用程序可以通过从缓存中删除其User对象来响应UserCreated.这有助于多个Web应用程序作为Web场的一部分保持彼此同步.

订阅事件的Web应用程序(再次以UserCreated为例)的更具冒险性的用途是创建一个超可扩展的登录服务,该服务从不必查询数据库来验证用户.在启动时,Web应用程序会将所有用户名和密码哈希加载到内存中的字典中,然后通过添加到该字典来订阅UserCreated事件.它也可能订阅UserPasswordChanged事件,以便更新该字典.

(在这种情况下,重要的是不考虑缓存整个用户对象 - 此服务只涉及身份验证,而不是授权,因此只会存储用户名和密码哈希值.)

为了实现这一点,您必须自己在Global.asax中设置总线,如在您自己的Process托管NServiceBus中所述.该.LoadMessageHandlers()行对于让NServiceBus扫描您的网站程序集的消息处理程序至关重要.

这是Web应用程序的典型流畅配置块:

public static IBus Bus { get; set; }

// In Application_Start()
Bus = NServiceBus.Configure.WithWeb()
        .Log4Net()
        .DefaultBuilder()
        .XmlSerializer()
        .MsmqTransport()
            .IsTransactional(false)
            .PurgeOnStartup(true)
        .UnicastBus()
            .ImpersonateSender(false)
            .LoadMessageHandlers() // <-- only if handling commands/events
        .CreateBus()
        .Start();
Run Code Online (Sandbox Code Playgroud)

由于Web应用程序本质上不稳定(它们经常循环并且经常丢失其状态),因此在启动期间使用该.PurgeOnStartup(true).MsmqTransport()以便刷新等待队列中的Web应用程序的任何消息是很常见的.这是因为通常,发往Web应用程序的消息是修改状态的指令,但刚刚启动的Web应用程序没有状态!当我们知道我们的缓存是空的时候,为什么要处理一堆命令来"删除缓存项X"?

总而言之,您可以(并且在某些情况下,应该)让您的Web应用程序订阅来自其他服务的事件,这取决于您的业务逻辑,您只需要小心如何执行它.