Azure 无法安装NServiceBus主机Windows服务

Azure 无法安装NServiceBus主机Windows服务,azure,nservicebus,Azure,Nservicebus,我正在尝试按照说明使用VideoStore示例应用程序的NServiceBus.host.exe安装windows服务主机。我在按照警察的指示办事 在Visual Studio中执行F5会话时,我的应用程序运行良好。它使用主机的控制台应用程序模式进行托管。当我尝试使用命令行执行安装时,会出现多个错误 我正在运行的命令行是: NServiceBus.Host.exe/install/serviceName:“VideoStore.Sales” /displayName:“VideoStore.Sa

我正在尝试按照说明使用VideoStore示例应用程序的NServiceBus.host.exe安装windows服务主机。我在按照警察的指示办事

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

我正在运行的命令行是:

NServiceBus.Host.exe/install/serviceName:“VideoStore.Sales” /displayName:“VideoStore.Sales”/description:”的端点 视频商店。销售“ /endpointConfigurationType:“VideoStore.Sales.EndpointConfig, VideoStore.Sales“/用户名:“.\MySvc”/password:“我的密码” N服务总线.生产

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

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

未处理的异常:System.InvalidOperationException:序列 至少包含一个匹配元素 System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable
1源、,
Func
2谓词)位于 System.Linq.Enumerable.whereselectArrayInterator
2.MoveNext()位于
System.Linq.Enumerable.WhereEnumerableInterator
1.MoveNext()位于 System.Collections.Generic.List
1..ctor(IEnumerable
1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 source)at
NServiceBus.Hosting.Profiles.ProfileManager..ctor(列表
1 assembliesToScan,IConfigureHiseEndpoint说明符,字符串[]参数, 列表` 1(默认配置文件)

事实证明,导致此错误的原因是我的应用程序同时引用了NServiceBus.Host程序集和NServiceBus.Hosting.Azure程序集。这是因为我的应用程序既部署在Windows环境中,也部署到Azure worker角色中。我可以在azure emulator和工作人员角色的控制台模式之间切换,而无需更改调试时启动的项目。(Azure云服务项目与每个工人项目)

我可以通过删除NServiceBus.Hosting.Azure.dll程序集来解决此问题,以防止程序集扫描找到它。这是一只虫子。允许我显式指定主机类型,或者处理发现多个类型的场景

这停止了以前的异常,并引入了一个新的异常:

未处理的异常: System.Configuration.ConfigurationErrorsException:命令行 参数“endpointConfigurationType”已指定使用该类型 “VideoStore.Sales.EndpointConfig,VideoStore.Sales”但该类型 无法加载。在 NServiceBus.Hosting.Windows.EndpointTypeDeterminator.TryGetEndpointConfigurationTypeFromArguments(主机参数 y:\BuildAgent\work中的参数,类型(&Type) \31f8c64a6e8a2d7c\src\NServiceBus.Hosting.Windows\endpointTypedeterminator.cs:line 101位于中的NServiceBus.Hosting.Windows.Program.Main(字符串[]args) y:\BuildAgent\work\31f8c64a6e8a2d7c\src\NServiceBus.Hosting.Windows\Program.cs:line 三十八

该类型和该程序集都存在。我甚至通过启用fusion loader日志来验证.NET是否正在加载该类型:

手术是成功的。绑定结果:hr=0x0。手术 已成功完成

从以下位置加载程序集管理器: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll运行于 可执行 C:\Projects\Testing\NServiceBus.Azure.Samples master\VideoStore.AzureServiceBus.Cloud\VideoStore.Sales\bin\Debug\NServiceBus.Host.exe ---下面是详细的错误日志

===预绑定状态信息===日志:DisplayName=VideoStore。销售(部分)警告:已为提供部分绑定信息 程序集:警告:程序集名称:VideoStore.Sales |域ID:1警告:A 当仅显示部件显示名称的一部分时,会发生部分绑定 假如警告:这可能导致活页夹加载错误 装配警告:建议提供完全指定的文本 程序集的标识,WRN:由简单名称组成, 版本、区域性和公钥令牌。警告:见白皮书 有关更多信息和 这一问题的共同解决办法。日志:Appbase= file:///C:/Projects/Testing/NServiceBus.Azure.Samples-master/VideoStore.AzureServiceBus.Cloud/VideoStore.Sales/bin/Debug/ 日志:初始PrivatePath=NULL日志:动态基=NULL日志:缓存 Base=NULL日志:AppName=NServiceBus.Host.exe调用程序集: NServiceBus.Host,版本=4.6.0.0,区域性=中性, PublicKeyToken=9fc386479f8a226c

我做错了什么

编辑

我相信我看到了这个问题。基本上,试图避免第一个错误,即NServiceBus正在解析多个配置文件,因为它在NServiceBus.Core和NServiceBus.Hosting.Azure中都找到了这些配置文件,这导致了第二个错误

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

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


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

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

Configure.With(string probeDirectory)
Configure.With(params Assembly[] assemblies)
Configure.With(IEnumerable<Type> typesToScan)
Configure.With(字符串probeDirectory)
配置.With(参数程序集[]程序集)
配置.With(IEnumerable typesToScan)
默认情况下,我认为nservicebus会扫描文件夹中的所有程序集,因此,如果只使用所需的程序集进行筛选,它将防止收到此类错误


此问题的根本原因是,当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
    }
}