C# 如何修复使用localhost初始化的请求/响应时MassTransit.EndpointNotFoundException?
我们正在使用masstransit,其请求/响应模式如下所述: 由于某种原因,当使用localhost初始化总线时,我在响应端使用context.RespondAsync方法接收到MassTransit.EndpointNotFoundException 当总线用实际IP初始化时,它工作正常,没有任何异常 我们还将总线与其他模式的masstransit一起使用,并使用localhost进行初始化,没有任何问题 我们尝试在请求端同时使用Request和GetResponse模式,认为问题的根源可能在那里,但没有成功 以下是响应端的使用者代码,它在RespondAsync上生成异常:C# 如何修复使用localhost初始化的请求/响应时MassTransit.EndpointNotFoundException?,c#,masstransit,C#,Masstransit,我们正在使用masstransit,其请求/响应模式如下所述: 由于某种原因,当使用localhost初始化总线时,我在响应端使用context.RespondAsync方法接收到MassTransit.EndpointNotFoundException 当总线用实际IP初始化时,它工作正常,没有任何异常 我们还将总线与其他模式的masstransit一起使用,并使用localhost进行初始化,没有任何问题 我们尝试在请求端同时使用Request和GetResponse模式,认为问题的根源可能
public override async Task Consume(ConsumeContext<IImageRequest> context)
{
var msg = context.Message;
try
{
var image = GetImage(msg.Id);
await context.RespondAsync<IImageResult>(new
{
msg.Id,
AImage = image
});
}
catch (Exception e)
{
Logger.Instance.Error($"{e}");
}
}
我想知道有没有解决办法?或者这是一个已知的问题
谢谢,本地主机在文件C:\Windows\System32\Drivers\etc\hosts中定义。在某些机器上设置为IP地址,在另一台机器上设置为环回127.0.0.1。您可以编辑该文件。如果您试图连接到该地址,网络库通常会给出一个错误。问题可能出在服务器上。服务器应使用计算机IP地址。相反,服务器应该侦听IP.Any。服务器和客户端不能使用相同的IP地址和端口。因此,通常您会创建服务器IP。因此,当服务器和侦听器位于同一台机器上时,它与客户端不同。在请求端,总线初始化代码是什么?您必须在整个应用程序生命周期内配置并启动总线才能使用MassTransit。@AlexeyZimarev感谢-添加了初始化代码。@jdweng感谢-主机文件是默认文件(所有内容都有注释)-未定义本地主机。@YuvalBechor订阅服务器是什么?你从哪里开始乘公共汽车?
Task.Run(async () =>
{
var reqResClient =
BusControl.GetBusControl.CreateRequestClient<IImageRequest, IImageResult>("requestimage");
var req = new ImageRequest(msg.Id);
var response = await reqResClient.Request(req);
}).Wait();
_bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
cfg.Durable = true;
_host = cfg.Host(HostName, port, VirtualHost, h =>
{
h.Username(UserName);
h.Password(Password);
});
cfg.ReceiveEndpoint(host, subscriber.QueueName, ep =>
{
ep.Durable = !subscriber.AutoDelete;
ep.AutoDelete = subscriber.AutoDelete;
ep.Instance(subscriber.Consumer);
if (subscriber.PrefetchCount.HasValue)
ep.PrefetchCount = subscriber.PrefetchCount.Value;
if (subscriber.ConcurrencyLimit.HasValue)
ep.UseConcurrencyLimit(subscriber.ConcurrencyLimit.Value);
});
cfg.Message<T>(x =>
{
x.SetEntityName(entityName);
});
});
public void Start()
{
if (_state == BusState.NotInitialized)
throw new InvalidOperationException("Cannot start bus. Bus is not initialized");
_bus?.Start();
_state = BusState.Started;
}