我有一个具有Web和辅助角色的Windows Azure云服务。两个角色都使用组合根中的Unity容器来注册类型(截至本文的最新nuget pkgs)。
在调试时在Azure模拟器中运行时,所有这些代码都运行良好,但是,当我创建一个包并部署云服务时,我在角色运行时立即遇到此错误(Web角色将在此时遇到此错误我点击了一个取决于所讨论类型的页面,而工作者角色会在运行时立即点击它。
我收到NullReferenceException,如下所示:
[ResolutionFailedException: Resolution of the dependency failed, type = "MyApp.Mvc.Controllers.HomeController", name = "(none)".
Exception occurred while: Calling constructor MyApp.Azure.Messaging.ServiceBusMessagingClient(System.String serviceBusConnectionString).
Exception is: NullReferenceException - Object reference not set to an instance of an object.
以下是我的类型的ctor中的代码,它是Azure Service Bus的包装客户端:
public ServiceBusMessagingClient(string serviceBusConnectionString)
{
Guard.NotNullOrEmpty(() => serviceBusConnectionString, serviceBusConnectionString);
_log = LogFactory.GetCurrentClassLogger();
ConnectionString = serviceBusConnectionString;
_msgFactory = MessagingFactory.CreateFromConnectionString(ConnectionString);
_retryPolicy = new RetryPolicy<ServiceBusTransientErrorDetectionStrategy>(RetryStrategy.DefaultClientRetryCount);
_clients = new Dictionary<string, QueueClient>();
}
这是我的bootstrapper的代码,在web app_start或worker角色的OnStart中调用:
var sbConn = CloudConfigurationManager.GetSetting(Constants.KeyServiceBusConnectionString);
container.RegisterType<IMessagingClient, ServiceBusMessagingClient>(new InjectionConstructor(sbConn));
任何人都可以告诉我为什么我会得到这样的例外吗?我无法在ctor代码中看到任何可能产生空引用的内容。我不明白为什么它在模拟器中工作但在云部署中不起作用。我已经验证了云设置,以确保我的连接字符串存在。谢谢!
答案 0 :(得分:1)
好的......在创建System.Reflection.StackFrame时,我发现从DEBUB到RELEASE的一些模糊行为更改。
我的LogFactory.GetCurrentClassLogger()
方法执行以下代码:
StackFrame frame = new StackFrame(1, false);
显然,在RELEASE构建中,向上移动堆栈将为frame.GetMethod().DeclaringType
产生一个空值。
所以解决方案是检查null并使用静态字符串作为记录器名称,如果为null。每天学习一些东西希望这有助于某人。