无法安装NServiceBus主机Windows服务

时间:2014-06-19 20:58:45

标签: azure nservicebus

我尝试按照说明使用NServiceBus.Host.exe为VideoStore示例应用安装Windows服务主机。我按照web site的说明进行操作。

在Visual Studio中执行F5会话时,我的应用程序运行正常。它使用主机的控制台应用程序模式进行托管。当我尝试使用命令行执行安装时,我收到多个错误。

我正在运行的命令行是:

  

NServiceBus.Host.exe / install /serviceName:"VideoStore.Sales"   /displayName:"VideoStore.Sales" / description:" Endpoint for   VideoStore.Sales"   /endpointConfigurationType:"VideoStore.Sales.EndpointConfig,   VideoStore.Sales" /username:".\MySvc" /密码:" MyPassword输入"   NServiceBus.Production

运行此操作会导致以下异常:

  

在安装AppDomain中初始化安装程序

     

未处理的异常:System.InvalidOperationException:Sequence   包含多个匹配元素   System.Linq.Enumerable.SingleOrDefault [TSource](IEnumerable 1 source, Func 2谓词)at at   System.Linq.Enumerable.WhereSelectArrayIterator 2.MoveNext() at System.Linq.Enumerable.WhereEnumerableIterator 1.MoveNext()at at   System.Collections.Generic.List 1..ctor(IEnumerable 1集合)
  在System.Linq.Enumerable.ToList [TSource](IEnumerable 1 source) at NServiceBus.Hosting.Profiles.ProfileManager..ctor(List 1   assembliesToScan,IConfigureThisEndpoint说明符,String [] args,   List`1 defaultProfiles)

事实证明,此错误是由于我的应用程序引用NServiceBus.Host程序集以及NServiceBus.Hosting.Azure程序集引起的。这是因为我的应用程序既部署在Windows环境中,也部署在Azure辅助角色中。我可以简单地通过更改我在调试时启动的项目,在工作人员角色的天蓝色模拟器和控制台模式之间切换。 (Azure云服务项目与每个工作项目。)

我能够通过删除NServiceBus.Hosting.Azure.dll程序集来解决此问题,以防止程序集扫描找到它。恕我直言,这是一个错误。允许我明确指定主机类型或处理找到多个类型的场景。

这停止了之前的异常,而是引入了一个新异常:

  

未处理的例外情况:   System.Configuration.ConfigurationErrorsException:命令行   参数' endpointConfigurationType'已指定使用该类型   ' VideoStore.Sales.EndpointConfig,VideoStore.Sales'但那种类型   无法加载。在   NServiceBus.Hosting.Windows.EndpointTypeDeterminer.TryGetEndpointConfigurationTypeFromArguments(HostArguments   论证,Type&在y:\ BuildAgent \ work中输入   \ 31f8c64a6e8a2d7c的\ src \ NServiceBus.Hosting.Windows \ EndpointTypeDeterminer.cs:行   在NServiceBus.Hosting.Windows.Program.Main(String [] args)中的101   Y:\ BuildAgent \工作\ 31f8c64a6e8a2d7c的\ src \ NServiceBus.Hosting.Windows \的Program.cs:行   38

该类型和该程序集都存在。我甚至通过启用融合加载程序日志记录验证.NET正在加载类型:

  

手术成功。绑定结果:hr = 0x0。操作   成功完成。

     

装配管理器从以下位置加载:   C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ clr.dll正在运行   可执行   C:\项目\测试\ NServiceBus.Azure.Samples主\ VideoStore.AzureServiceBus.Cloud \ VideoStore.Sales \ BIN \调试\ NServiceBus.Host.exe   ---详细的错误日志如下。

     

===预绑定状态信息===日志:DisplayName = VideoStore.Sales(部分)警告:提供了部分绑定信息   程序集:WRN:程序集名称:VideoStore.Sales |域ID:1 WRN:A   仅部分程序集显示名称为时发生部分绑定   提供。警告:这可能导致活页夹加载不正确   部件。警告:建议提供完全指定的文本   程序集的身份,WRN:由简单名称组成,   版本,文化和公钥令牌。警告:见白皮书   http://go.microsoft.com/fwlink/?LinkId=109270了解更多信息和   这个问题的常见解决方案。日志:Appbase =   文件:/// C:/Projects/Testing/NServiceBus.Azure.Samples-master/VideoStore.AzureServiceBus.Cloud/VideoStore.Sales/bin/Debug/   日志:初始PrivatePath = NULL日志:动态Base = NULL日志:缓存   Base = NULL LOG:AppName = NServiceBus.Host.exe调用程序集:   NServiceBus.Host,Version = 4.6.0.0,Culture = neutral,   公钥= 9fc386479f8a226c。

我在这里做错了什么?

修改

我相信我看到了这个问题。基本上,试图避免NServiceBus解析多个Profiles的第一个错误,因为它在NServiceBus.Core和NServicebus.Hosting.Azure中发现它们导致第二个错误。

这是因为为了加载我的EndpointConfig类型,.NET还需要加载NServicebus.Hosting.Azure程序集,因为它实现了AsA_Worker,它位于NServiceBus.Hosting.Azure中。

因此,要删除该程序集,我阻止它加载EndpointConfig。

我还不清楚如何解决这个问题。我需要让NServiceBus停止扫描两个主机程序集。这表明christof13的回答是正确的,但是我无法让NServiceBus忽略它自己的程序集。

2 个答案:

答案 0 :(得分:1)

此问题的根本原因是当NServiceBus枚举可用的配置文件时,它会扫描所有可用的程序集,然后执行LINQ语句以按类型名称对其进行过滤。

问题是有两个NServiceBus.Production配置文件,一个在NServiceBus.Host.dll中定义,另一个在NServiceBus.Hosting.Azure程序集中定义。它们的类型名称相同,因此LINQ SingleOrDefault失败。

过滤搜索的程序集的建议不起作用,因为NServiceBus总是加载自己的程序集。过滤器仅适用于我的项目程序集。

我能够通过创建一个与项目中任何程序集中定义的任何其他配置文件名称不同的自定义配置文件来解决此问题。类似的东西:

public class DualCloudLocalProfile : IProfile {}

public class DualCloudLocalProfileHandler : IHandleProfile<DualCloudLocalProfile>
{
    public void ProfileActivated()
    {
        if (LogManager.LoggerFactory is NullLoggerFactory || LogManager.LoggerFactory == null)
        {
            Configure.Instance.TraceLogger().ConsoleLogger();
        }            
    }
}

public class CloudProfileLoggingHandler : IConfigureLoggingForProfile<DualCloudLocalProfile>
{
    public void Configure(IConfigureThisEndpoint specifier)
    {
        //nothing for now
    }
}

一旦将其添加到我的项目中,我修改了install命令以指定新的配置文件:

NServiceBus.Host.exe /install /serviceName:"VideoStore.Sales" /displayName:"VideoStore.Sales" /description:"Endpoint for VideoStore.Sales" /endpointConfigurationType:"VideoStore.Sales.EndpointConfig, VideoStore.Sales" /username:".\MySvc" /password:"MyPassword" VideoStore.Sales.DualCloudLocalProfile

这解决了这个问题。我现在可以将项目作为云服务和NServiceBus.Host.exe托管服务运行,也可以通过/ install命令为主机部署。

答案 1 :(得分:0)

您可以尝试使用以下方法之一过滤程序集

Configure.With(string probeDirectory)
Configure.With(params Assembly[] assemblies)
Configure.With(IEnumerable<Type> typesToScan)

默认情况下,我认为nservicebus扫描文件夹中的所有程序集,因此如果仅使用所需的程序集进行筛选,则会阻止接收此类错误

http://docs.particular.net/nservicebus/the-nservicebus-host