0

我有一个具有 Web 和辅助角色的 Windows Azure 云服务。这两个角色都使用组合根中的 Unity 容器来注册类型(截至本文的最新 nuget pkgs)。

所有这些代码在调试时在 Azure 模拟器中运行时运行良好,但是,当我创建包并部署云服务时,我在角色运行时立即遇到此错误(当我点击页面取决于所讨论的类型,而工作人员角色将在运行时立即点击它)。

我得到一个 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 服务总线的包装器客户端:

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>();
    }

这是我的引导程序的代码,在 web app_start 或工作角色的 OnStart 中调用:

var sbConn = CloudConfigurationManager.GetSetting(Constants.KeyServiceBusConnectionString);
container.RegisterType<IMessagingClient, ServiceBusMessagingClient>(new InjectionConstructor(sbConn));

谁能告诉我为什么我会遇到这样的异常?我在 ctor 代码中看不到任何可能产生空引用的内容。而且我不明白为什么它在模拟器中有效,但在云部署中无效。我已经验证了云设置以确保我的连接字符串在那里。谢谢!

4

1 回答 1

1

好的...我在创建 System.Reflection.StackFrame 时发现了一些从 DEBUB 到 RELEASE 的模糊行为变化。

我的LogFactory.GetCurrentClassLogger()方法执行以下代码:

StackFrame frame = new StackFrame(1, false);

显然,当在 RELEASE 构建中时,这将产生一个 null for 堆栈frame.GetMethod().DeclaringType

因此解决方案是检查 null 并使用静态字符串作为记录器名称,如果为 null。每天学习一些东西。希望这可以帮助某人。

于 2013-03-20T16:03:09.537 回答