У меня работает экспериментальный проект NServiceBus, который имеет:
- MyProject.Core - издатель сообщений, использующий NServiceBus.Host.exe
- MyProject.Subscriber = подписчик сообщения 1, использующий NServiceBus.Host.exe
- MyProject.ConsoleSubscriber - консольное приложение .NET с явной инициализацией и подпиской
- MyProject.WebApp - веб-приложение ASP.NET MVC 2
Когда я запускаю проект, размещенный подписчик NSB получает сообщения от ядра - но веб-приложение и консольное приложение не получают; точка останова в обработчике сообщений никогда не срабатывает, и я не получаю никаких диагностических данных в окне вывода VS.
Консольное приложение имеет следующий код:
using System;
using MyProject.Messages.PublishedByCore;
using NServiceBus;
namespace MyProject.ConsoleSubscriber {
class Program {
static void Main(string[] args) {
var bus = NServiceBus.Configure.With()
.Log4Net()
.DefaultBuilder()
.XmlSerializer()
.MsmqTransport()
.IsTransactional(false)
.PurgeOnStartup(false)
.UnicastBus()
.ImpersonateSender(false)
.CreateBus()
.Start();
bus.Subscribe<FileChangedMessage>();
while (Console.ReadLine() != null) { }
}
}
public class FileChangedMessageHandler : IHandleMessages<FileChangedMessage> {
public void Handle(FileChangedMessage message) {
Console.WriteLine(message.FilePath);
}
}
}
и следующий файл App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
<section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
</configSections>
<MsmqTransportConfig InputQueue="MyConsoleClient" ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5" />
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="MyProject.Messages.PublishedByCore" Endpoint="MyProjectCoreInputQueue" />
</MessageEndpointMappings>
</UnicastBusConfig>
</configuration>
Global.asax.cs веб-приложения выглядит следующим образом:
using System.Diagnostics;
using System.Web.Mvc;
using System.Web.Routing;
using MyProject.Messages.PublishedByCore;
using NServiceBus;
namespace MyProject.WebApp {
public class MvcApplication : System.Web.HttpApplication {
public static void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
public static IBus Bus { get; set; }
protected void Application_Start() {
Bus = NServiceBus.Configure.WithWeb()
.Log4Net()
.DefaultBuilder()
.XmlSerializer()
.MsmqTransport()
.IsTransactional(false)
.PurgeOnStartup(false)
.UnicastBus()
.ImpersonateSender(false)
.CreateBus()
.Start();
Bus.Subscribe<FileChangedMessage>(); RegisterRoutes(RouteTable.Routes);
}
}
public class FileChangedMessageHandler : IHandleMessages<FileChangedMessage> {
public void Handle(FileChangedMessage message) {
Debug.WriteLine(message.FilePath);
}
}
}
и соответствующий раздел файла Web.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
<sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere" />
<section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
<section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
<section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
</sectionGroup>
</sectionGroup>
</sectionGroup>
<section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
<section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
</configSections>
<MsmqTransportConfig InputQueue="MyWebClient" ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5" />
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="MyProject.Messages.PublishedByCore" Endpoint="MyProjectCoreInputQueue" />
</MessageEndpointMappings>
</UnicastBusConfig>
Насколько я вижу, код конфигурации и инициализации у подписчиков в Интернете и на консоли идентичен, кроме Congfigure.With()
против Configure.WithWeb()
- поэтому я не могу понять, почему это не работает. Есть ли какая-то дополнительная конфигурация, необходимая для фактической подписки на очередь сообщений из веб-приложения .NET, которая мне не хватает?