我想知道我的Web应用程序如何从服务器订阅事件?我知道Web应用程序不能发布事件。在异步示例中,是向服务器发送消息的Web应用程序。我希望应用程序SUBSCRIBE到服务器。在其他方面,如何处理来自Web应用程序的事件。 我不知道如何编写Global.asax页面: public class Global:System.Web.HttpApplication和void Application_Start(object sender,EventArgs e)方法。 提前致谢, 卢瓦克
答案 0 :(得分:9)
我不得不反对休。 Web应用程序订阅其他服务发布的事件有非常正当的理由。
通常情况下,您不希望采取数据库操作。一个主要的用例是用于缓存管理。使用评论中的UserCreated示例,Web应用程序可以通过从缓存中删除其User对象来响应UserCreated。这有助于多个Web应用程序作为Web场的一部分保持彼此同步。
订阅事件的Web应用程序(再次以UserCreated为例)的更冒险的用途是创建一个超可扩展的登录服务,它永远不必查询数据库来验证用户。在启动时,Web应用程序会将所有用户名和密码哈希加载到内存中的字典中,然后通过添加到该字典来订阅UserCreated事件。它也可能订阅UserPasswordChanged事件,以便更新该字典。
(在这种情况下,重要的是不考虑缓存整个用户对象 - 此服务只涉及身份验证,而不是授权,因此只会存储用户名和密码哈希值。)
为了实现这一目标,您必须自己在Global.asax中设置总线,如Hosting NServiceBus in your own Process中所述。 .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();
由于Web应用程序本质上不稳定(它们经常回收并且经常丢失状态),因此在.PurgeOnStartup(true)
之后使用.MsmqTransport()
行来刷新在队列中等待Web应用程序的任何消息是很常见的。启动。这是因为通常,发往Web应用程序的消息是修改状态的指令,但刚刚启动的Web应用程序没有状态!当我们知道我们的缓存为空时,为什么要处理一堆命令来“删除缓存项X”?
总而言之,您可以(并且在某些情况下,应该)让您的Web应用程序订阅来自其他服务的事件,这取决于您的业务逻辑,您只需要小心如何执行它。
答案 1 :(得分:0)
好的,我想我知道你在说什么。
基本上,我假设您的Web应用程序托管在IIS中,它正在查看数据库,然后将结果显示给用户。
您希望从其他服务引发的业务事件作为消息发送并接收到数据库中,从而允许您的用户刷新页面并查看新数据。
您想要做的事情非常合理,但您需要停止考虑订阅某项内容的网络应用。
您需要的是另一种接收发件人服务发送的邮件的服务。当服务收到消息时,它会将该消息写入数据库。
然后,您的网络应用程序可以从数据库中提取数据并显示给用户。
这两个过程是完全独立的。您的Web应用程序托管在IIS中。您的接收器服务可以托管在自己的进程中。这会将您的Web应用程序与接收方服务分离。
您可以使用NServiceBus启用此方案。
您的发件人服务成为NServiceBus邮件发件人,您的接收者服务成为NServiceBus邮件接收者。最简单的方法是使用NServiceBus通用主机托管您的发送方和接收方,并将它们作为Windows服务部署。