Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Masstransit-Rabbit MQ虚拟主机_C#_Rabbitmq_Masstransit - Fatal编程技术网

C# Masstransit-Rabbit MQ虚拟主机

C# Masstransit-Rabbit MQ虚拟主机,c#,rabbitmq,masstransit,C#,Rabbitmq,Masstransit,我正在使用公共交通并连接到我的兔子经纪人 string uri1 = @"rabbitmq://myusername:mypassword@myip/myvirtualhost/myqueue"; 我一直收到未处理的配置异常 创建服务总线期间引发异常 {System.Collections.ListDictionaryInternal.NodeKeyValueCollection} {“启动总线服务失败”}位于 中的MassTransit.ServiceContainer.Start() d

我正在使用公共交通并连接到我的兔子经纪人

 string uri1 = @"rabbitmq://myusername:mypassword@myip/myvirtualhost/myqueue";
我一直收到未处理的配置异常

创建服务总线期间引发异常 {System.Collections.ListDictionaryInternal.NodeKeyValueCollection} {“启动总线服务失败”}位于 中的MassTransit.ServiceContainer.Start() d:\BuildAgent-03\work\aa063b4295dfc097\src\MassTransit\ServiceContainer.cs:line 83在MassTransit.ServiceBus.Start()中 d:\BuildAgent-03\work\aa063b4295dfc097\src\MassTransit\ServiceBus.cs:line 369位于MassTransit.Builders.ServiceBusBuilderImpl.Build()中 d:\BuildAgent-03\work\aa063b4295dfc097\src\MassTransit\Configuration\Builders\ServiceBusBuilderImpl.cs:line 84在 MassTransit.BusConfigurators.ServiceBusConfiguratorImpl.CreateServiceBus() 在里面 d:\BuildAgent-03\work\aa063b4295dfc097\src\MassTransit\Configuration\BusConfigurators\ServiceBusConfiguratorImpl.cs:line 171位于MassTransit.ServiceBusFactory.New(操作'1配置)中 d:\BuildAgent-03\work\aa063b4295dfc097\src\MassTransit\Configuration\ServiceBusFactory.cs:line 44

真正奇怪的是,它在不指定虚拟主机的情况下工作,但它们当然会转到错误的虚拟主机

然后,我下载了rabbitMQ库,它使用我的凭据连接到正确的虚拟主机。这是我如何知道我的凭据,虚拟主机设置良好。我甚至添加了一个队列,以防出现问题。Masstransit中有什么bug吗?我真的不知道我做错了什么。我正在考虑不使用masstransit并编写自己的轻量级版本

我甚至将其复制粘贴到我的解决方案中,以检查它是否正确地修剪虚拟主机,并且是否正确。我真的很困惑静态只读正则表达式正则表达式=新正则表达式(@“^[A-Za-z0-9-.:]+$”

公共静态RabbitMqEndpointAddress解析(Uri地址)
{
Guard.AgainstNull(地址,“地址”);
if(string.Compare(“rabbitmq”,address.Scheme,true)!=0)
抛出新的RabbitMqAddressException(“指定了无效的方案:“+address.scheme??”(null)”);
var connectionFactory=新的connectionFactory
{
主机名=地址.Host,
用户名=”,
密码=”,
};
if(地址IsDefaultPort)
connectionFactory.Port=5672;
如果(!address.IsDefaultPort)
connectionFactory.Port=地址.Port;
如果(!address.UserInfo.IsEmpty())
{
if(address.UserInfo.Contains(“:”)
{
string[]parts=address.UserInfo.Split(“:”);
connectionFactory.UserName=零件[0];
connectionFactory.Password=部件[1];
}
其他的
connectionFactory.UserName=address.UserInfo;
}
字符串名称=地址.绝对路径.子字符串(1);
string[]pathSegments=name.Split('/');
如果(pathSegments.Length==2)
{
connectionFactory.VirtualHost=pathSegments[0];
名称=路径段[1];
}
ushort heartbeat=address.Query.GetValueFromQueryString(“heartbeat”,connectionFactory.RequestedHeartbeat);
connectionFactory.RequestedHeartbeat=心跳;
验证队列或交换名称是否合法(名称);
返回新的RabbitMqEndpointAddress(地址、连接工厂、名称);
}
静态void VerifyQueueOrExchangeNameIsLegal(字符串路径)
{
Match=_regex.Match(路径);
如果(!match.Success)
抛出新的RabbitMqAddressException(FormatErrorMsg);
}
常量字符串FormatErrorMsg=
路径可以为空,也可以是以下字符的序列:字母、数字、连字符、下划线、句点或冒号;
私有静态void Main(字符串[]args)
{
字符串uri1=@”rabbitmq://username:password@mydomain.co.za/vhost/queue”;
IServiceBus服务总线;
var result=Parse(新Uri(uri1));
serviceBus=ServiceBusFactory.New(sbc=>
{
sbc.UseRabbitMq();
sbc.从(uri1)收到;
Subscribe(c=>c.Consumer());
});
IPPublish publishMessage=新的海量传输发布器(uri1);
publishMessage.Publish(新发送电子邮件)
{
EmailFrom=“*@8.co.za”,
EmailTo=“*@*.co.za”,
Subject=“你好”,
Body=“你好”
});
Console.ReadKey();
JobRunner JobRunner=新JobRunner();
jobRunner.Start();
Console.ReadKey();
}`

任何帮助都将不胜感激,或者任何其他我可以尝试让这个工作

您使用的是什么版本的MassTransit

我们从Uri中删除了声明用户名和密码的功能(因此它不会出现在日志中),您必须通过API来实现


感谢您在有用户名和密码时没有引发异常。
    public static RabbitMqEndpointAddress Parse(Uri address)
    {
        Guard.AgainstNull(address, "address");

        if (string.Compare("rabbitmq", address.Scheme, true) != 0)
            throw new RabbitMqAddressException("The invalid scheme was specified: " + address.Scheme ?? "(null)");

        var connectionFactory = new ConnectionFactory
        {
            HostName = address.Host,
            UserName = "",
            Password = "",
        };

        if (address.IsDefaultPort)
            connectionFactory.Port = 5672;
        else if (!address.IsDefaultPort)
            connectionFactory.Port = address.Port;

        if (!address.UserInfo.IsEmpty())
        {
            if (address.UserInfo.Contains(":"))
            {
                string[] parts = address.UserInfo.Split(':');
                connectionFactory.UserName = parts[0];
                connectionFactory.Password = parts[1];
            }
            else
                connectionFactory.UserName = address.UserInfo;
        }

        string name = address.AbsolutePath.Substring(1);
        string[] pathSegments = name.Split('/');
        if (pathSegments.Length == 2)
        {
            connectionFactory.VirtualHost = pathSegments[0];
            name = pathSegments[1];
        }

        ushort heartbeat = address.Query.GetValueFromQueryString("heartbeat", connectionFactory.RequestedHeartbeat);
        connectionFactory.RequestedHeartbeat = heartbeat;

       VerifyQueueOrExchangeNameIsLegal(name);

        return new RabbitMqEndpointAddress(address, connectionFactory, name);
    }
    static void VerifyQueueOrExchangeNameIsLegal(string path)
    {
        Match match = _regex.Match(path);

        if (!match.Success)
            throw new RabbitMqAddressException(FormatErrorMsg);
    }

    const string FormatErrorMsg =
      "The path can be empty, or a sequence of these characters: letters, digits, hyphen, underscore, period, or colon.";


    private static void Main(string[] args)
    {

        string uri1 = @"rabbitmq://username:password@mydomain.co.za/vhost/queue";
        IServiceBus serviceBus;

        var result =  Parse(new Uri(uri1));

        serviceBus = ServiceBusFactory.New(sbc =>
        {
            sbc.UseRabbitMq();
            sbc.ReceiveFrom(uri1);
            sbc.Subscribe(c => c.Consumer<SendEmailConsumer>());
        });

        IPublish publishMessage = new MassTransitPublisher(uri1);

        publishMessage.Publish(new SendEmail
            {
                EmailFrom = "*@8.co.za",
                EmailTo = "*@*.co.za",
                Subject = "hello",
                Body = "hello"
            });

        Console.ReadKey();


        JobRunner jobRunner = new JobRunner();

        jobRunner.Start();

        Console.ReadKey();
    }`
sbc.UseRabbitMq(x => 
                x.ConfigureHost("rabbitmq://yourhost/yourvhost/yourqueue", 
                x=> x.UserName, 
                x.Password))