我在Azure网站和Azure服务(实际是Web作业)中有NServiceBus。启动时,我遇到以下异常:
类型的第一次机会异常 发生'Autofac.Core.Registration.ComponentNotRegisteredException' 在Autofac.dll中
其他信息:请求的服务 'NServiceBus.Timeout.Core.IPersistTimeouts'尚未注册。 要避免此异常,请注册组件以提供 服务,使用IsRegistered()检查服务注册,或使用 ResolveOptional()方法来解析可选的依赖项。
启动代码:
var busConfiguration = ServiceBusConfig.Configure("MyEndpointName");
var startableBus = Bus.Create(busConfiguration);
startableBus.Start();
配置:
public static class ServiceBusConfig
{
public static BusConfiguration Configure(string endPointName)
{
var config = new BusConfiguration();
var storageconnectionstring = CloudConfigurationManager.GetSetting("StorageConnectionString");
var serviceBusConnectionString = CloudConfigurationManager.GetSetting("ServiceBusConnectionString");
config.AssembliesToScan(AllAssemblies.Matching("NServiceBus").And("MYAPP."));
config.CustomConfigurationSource(new ApplicationConfigurationSource());
config.EndpointName(endPointName);
config.UseSerialization<JsonSerializer>();
config.UseContainer<AutofacBuilder>(c => c.ExistingLifetimeScope(ContainerService.Container));
config.UsePersistence<AzureStoragePersistence, StorageType.Subscriptions>().ConnectionString(storageconnectionstring).TableName("Subscriptions");
config.UsePersistence<AzureStoragePersistence, StorageType.Sagas>().ConnectionString(storageconnectionstring);
config.UsePersistence<AzureStoragePersistence, StorageType.Timeouts>().ConnectionString(storageconnectionstring).TimeoutManagerDataTableName("TimeoutManager").TimeoutDataTableName("TimeoutData");
config.UseTransport<AzureServiceBusTransport>().ConnectionString(() => serviceBusConnectionString);
config.ScaleOut().UseSingleBrokerQueue();
config.Transactions().Enable();
config.EnableInstallers();
ConfigureConventions(config.Conventions());
return config;
}
private static void ConfigureConventions(ConventionsBuilder conventions)
{
conventions.DefiningCommandsAs(t => t.Namespace != null && t.Namespace.Contains("Commands"));
conventions.DefiningEventsAs(t => t.Namespace != null && t.Namespace.Contains("Events"));
conventions.DefiningMessagesAs(t => t.Namespace != null && t.Namespace.Contains("Messages"));
conventions.DefiningEncryptedPropertiesAs(t => t.GetCustomAttributes(true).Any(a => a.GetType().Name == "EncryptedAttribute"));
conventions.DefiningTimeToBeReceivedAs(t => t.Name.EndsWith("Expires")
? TimeSpan.FromSeconds(30)
: TimeSpan.MaxValue);
}
}
我正在尝试进行代码配置,所以这里是config.CustomConfigurationSource:
public class ApplicationConfigurationSource : IConfigurationSource
{
public T GetConfiguration<T>() where T : class, new()
{
if (typeof(T) == typeof(RijndaelEncryptionServiceConfig))
{
return new RijndaelEncryptionServiceConfig
{
Key = "some key is here"
} as T;
}
if (typeof(T) == typeof(AuditConfig))
{
return new AuditConfig
{
QueueName = "audit",
OverrideTimeToBeReceived = TimeSpan.FromMinutes(10)
} as T;
}
if (typeof(T) == typeof(MessageForwardingInCaseOfFaultConfig))
{
return new MessageForwardingInCaseOfFaultConfig
{
ErrorQueue = "error"
} as T;
}
return ConfigurationManager.GetSection(typeof(T).Name) as T;
}
}
虽然我已经使用了NServiceBus,但实际上不得不从头开始配置它并不经常发生,因此可能存在潜伏在某处的“新手”错误。
我试过config.DisableFeature<TimeoutManager>()
但没有快乐。也就是说,如果我必须明确启用TimeoutManager,我不知道如何为Azure做这件事。
如何摆脱这个错误?
谢谢, R上。