仅在 Azure 应用服务中出错:未将对象引用设置为对象的实例
Error only in Azure App Service: Object reference not set to an instance of an object
我有一个连续的 运行ning 作业(服务),我正在尝试将其作为应用服务部署到 Azure。它是在 Visual Studio 中作为典型的控制台应用程序创建的,然后它使用 TopShelf 到 运行 作为服务。
目前,我们正在将此服务部署到机架 Space 中托管的 windows 盒子。但我们正在从该模型转向 Azure。无论是在我的本地机器上调试还是在 Rack Space windows 服务器上,它 运行 都非常完美。但是当我部署到 Azure 时,出现对象引用错误。
这项服务的目的非常简单:在 Azure 服务总线上查询消息(如果有的话),将它们放入列表中,然后将列表交给另一个处理它们的 class。而已。服务总线的实际固定未在此项目或 class 中完成。为此,它依赖于 QueueAccess,它是一个单独的 class.
public class MessageQueueQuery : IMessageQueueQuery
{
...
private QueueAccess queueAccess; // QueueAccess is a reference to another project.
public void Start()
{
...
queueAccess = new QueueAccess();
...
// Go get the messages
try
{
messageList = queueAccess.GetMessageCollection(); // <-- ERROR IS HERE
}
catch (Exception ex)
{
_log.ErrorFormat("Error in retreiving a list of messages from queue.", ex);
}
同样,这适用于除作为应用服务部署到 Azure 之外的所有实例。完全相同的代码。我在想,也许我做错了部署?出于某种原因,QueueAccess 的 .dll 没有随部署一起发送?虽然当我通过 FTP 登录时,我可以看到它和其他文件一起放在那里。
这是完整的日志条目:
2016-05-20T20:56:08 PID[10568] Information at XXXXXX.Queue.Core.MessageQueueQuery.ProcessMessages() in C:\XXXXXXGit\XXXXXX\Main\XXXXXX.Queue.Core\MessageQueueQuery.cs:line 108
2016-05-20T20:56:08 PID[10568] Information 2016-05-20 20:56:08,156 [5] ERROR XXXXXX.Queue.WindowsService.Bootstrapper [(null)] - Error in retrieving a list of messages from queue.
我不确定为什么它不起作用。
我不是 TopShelf 用户但是:
在 Rackspace 中,我猜你的应用程序 运行s 在 VM (IaaS) 中。
在应用服务中,您的应用 运行 在 PaaS 中,而不是 IaaS 中。
您可以尝试将您的应用程序部署到 Azure VM。
或检查 TopShelf 与 Azure PaaS 的兼容性。他们似乎为工作者角色(= Azure PaaS v1 的一部分)提供了解决方案 https://github.com/Topshelf/Topshelf.Azure
您还可以查看本机 Azure PaaS v2 解决方案 运行 网络作业 https://azure.microsoft.com/en-us/documentation/articles/web-sites-create-web-jobs/
我有一个连续的 运行ning 作业(服务),我正在尝试将其作为应用服务部署到 Azure。它是在 Visual Studio 中作为典型的控制台应用程序创建的,然后它使用 TopShelf 到 运行 作为服务。
目前,我们正在将此服务部署到机架 Space 中托管的 windows 盒子。但我们正在从该模型转向 Azure。无论是在我的本地机器上调试还是在 Rack Space windows 服务器上,它 运行 都非常完美。但是当我部署到 Azure 时,出现对象引用错误。
这项服务的目的非常简单:在 Azure 服务总线上查询消息(如果有的话),将它们放入列表中,然后将列表交给另一个处理它们的 class。而已。服务总线的实际固定未在此项目或 class 中完成。为此,它依赖于 QueueAccess,它是一个单独的 class.
public class MessageQueueQuery : IMessageQueueQuery
{
...
private QueueAccess queueAccess; // QueueAccess is a reference to another project.
public void Start()
{
...
queueAccess = new QueueAccess();
...
// Go get the messages
try
{
messageList = queueAccess.GetMessageCollection(); // <-- ERROR IS HERE
}
catch (Exception ex)
{
_log.ErrorFormat("Error in retreiving a list of messages from queue.", ex);
}
同样,这适用于除作为应用服务部署到 Azure 之外的所有实例。完全相同的代码。我在想,也许我做错了部署?出于某种原因,QueueAccess 的 .dll 没有随部署一起发送?虽然当我通过 FTP 登录时,我可以看到它和其他文件一起放在那里。
这是完整的日志条目:
2016-05-20T20:56:08 PID[10568] Information at XXXXXX.Queue.Core.MessageQueueQuery.ProcessMessages() in C:\XXXXXXGit\XXXXXX\Main\XXXXXX.Queue.Core\MessageQueueQuery.cs:line 108
2016-05-20T20:56:08 PID[10568] Information 2016-05-20 20:56:08,156 [5] ERROR XXXXXX.Queue.WindowsService.Bootstrapper [(null)] - Error in retrieving a list of messages from queue.
我不确定为什么它不起作用。
我不是 TopShelf 用户但是:
在 Rackspace 中,我猜你的应用程序 运行s 在 VM (IaaS) 中。 在应用服务中,您的应用 运行 在 PaaS 中,而不是 IaaS 中。
您可以尝试将您的应用程序部署到 Azure VM。
或检查 TopShelf 与 Azure PaaS 的兼容性。他们似乎为工作者角色(= Azure PaaS v1 的一部分)提供了解决方案 https://github.com/Topshelf/Topshelf.Azure
您还可以查看本机 Azure PaaS v2 解决方案 运行 网络作业 https://azure.microsoft.com/en-us/documentation/articles/web-sites-create-web-jobs/