Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Asp.net core MassTransit消费者从未收到信息_Asp.net Core_Rabbitmq_Masstransit_Consumer - Fatal编程技术网

Asp.net core MassTransit消费者从未收到信息

Asp.net core MassTransit消费者从未收到信息,asp.net-core,rabbitmq,masstransit,consumer,Asp.net Core,Rabbitmq,Masstransit,Consumer,我正在按照在ASP.NET核心应用程序中使用MassTransit与RabbitMQ和Autofac的文档构建一个演示应用程序: 我的程序代码: namespace MessageDemo { public class Program { public static void Main(string[] args) { var host = Host.CreateDefaultBuilder(args)

我正在按照在ASP.NET核心应用程序中使用MassTransit与RabbitMQ和Autofac的文档构建一个演示应用程序:

我的程序代码:

namespace MessageDemo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = Host.CreateDefaultBuilder(args)
                .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                .ConfigureWebHostDefaults(webHostBuilder =>
                {
                    webHostBuilder
                        .UseContentRoot(Directory.GetCurrentDirectory())
                        .UseIISIntegration()
                        .UseStartup<Startup>();
                })
                .Build();
            host.Run();
        }
    }
}
namespace-MessageDemo
{
公共课程
{
公共静态void Main(字符串[]args)
{
var host=host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(新的AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webHostBuilder=>
{
网络主机生成器
.UseContentRoot(目录.GetCurrentDirectory())
.Useii整合()
.UseStartup();
})
.Build();
host.Run();
}
}
}
我的创业:

    public class Startup
    {
        public Startup(IWebHostEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            this.Configuration = builder.Build();
        }

        public IConfiguration Configuration { get; }
        public ILifetimeScope AutofacContainer { get; set; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddOptions();
            services.AddControllers();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }

        // ConfigureContainer is where you can register things directly
        public void ConfigureContainer(ContainerBuilder builder)
        {

            builder.RegisterType<DemoContent>().As<IDemoContent>();
            builder.RegisterType<WeatherForecast>().As<IWeatherForecast>();

            builder.AddMassTransit(x =>
            {
                x.AddConsumer<DemoConsumer>();

                x.AddBus(context => Bus.Factory.CreateUsingRabbitMq(cfg =>
                {

                    cfg.Host("rabbitmq://my_container_ip/", host =>
                    {
                        host.Username("devuser");
                        host.Password("devuser");
                    });


                    cfg.ReceiveEndpoint("submit-data", ec =>
                    {
                        // Configure a single consumer
                        ec.ConfigureConsumer<DemoConsumer>(context);
                    });

                }));
            });
        }
    }
公共类启动
{
公共启动(IWebHostEnvironment env)
{
var builder=new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile(“appsettings.json”,可选:true,重载更改:true)
.AddJsonFile($“appsettings.{env.EnvironmentName}.json”,可选:true)
.AddenEnvironmentVariables();
this.Configuration=builder.Build();
}
公共IConfiguration配置{get;}
公共ILifetimeScope自动传真容器{get;set;}
//此方法由运行时调用。请使用此方法将服务添加到容器中。
public void配置服务(IServiceCollection服务)
{
services.AddOptions();
services.AddControllers();
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
this.AutofacContainer=app.ApplicationServices.GetAutofacRoot();
app.UseRouting();
app.UseEndpoints(端点=>
{
endpoints.MapControllers();
});
}
//ConfigureContainer是您可以直接注册内容的地方
公共void配置容器(ContainerBuilder生成器)
{
builder.RegisterType().As();
builder.RegisterType().As();
builder.AddMassTransit(x=>
{
x、 AddConsumer();
x、 AddBus(context=>Bus.Factory.CreateUsingRabbitMq(cfg=>
{
主机(“rabbitmq://my_container_ip/,主机=>
{
host.Username(“devuser”);
主机密码(“devuser”);
});
接收端点(“提交数据”,ec=>
{
//配置单个使用者
ec.配置消费者(上下文);
});
}));
});
}
}
我的消费者:

    public class DemoConsumer : IConsumer<IDemoContent>
    {
        public async Task Consume(ConsumeContext<IDemoContent> context)
        {
            Debug.WriteLine($"Write content: {context.Message.Data}");
            await Console.Out.WriteLineAsync($"Write content: {context.Message.Data}");
        }
    }
公共类DemoConsumer:IConsumer
{
公共异步任务使用(使用上下文)
{
WriteLine($“写入内容:{context.Message.Data}”);
wait Console.Out.WriteLineAsync($“写入内容:{context.Message.Data}”);
}
}
为了进行测试,我通过点击一个控制器端点触发publish,PublishindPoint由容器注入:

        // GET: api/Demo
        [HttpGet]
        public async void Get()
        {
            await _endpoint.Publish<IDemoContent>(new
            {
                Data = "Some random content"
            }, new CancellationToken());
        }
//GET:api/Demo
[HttpGet]
公共异步void Get()
{
等待_endpoint.Publish(新建)
{
Data=“一些随机内容”
},新的CancellationToken());
}
这一切似乎都在起作用 -没有错误消息 -添加了一个使用InMemoryTestHarness的演示单元测试,该测试正在运行 -我的RabbitMQ实例在Manager Overview中注册已发布的消息


我正在RabbitMQ管理UI中获得发布者确认,但消息显示为不可终止(drop)。

由于您尚未添加托管服务,总线无法启动

services.AddMassTransitHostedService();

它就在代码片段中。

由于您尚未添加托管服务,因此总线无法启动

services.AddMassTransitHostedService();

它就在代码片段中。

谢谢,我不知道我怎么把那个调用放错地方了。还需要将BusRegistry builder.RegisterType()注册为().SingleInstance();谢谢,我不知道我怎么把电话放错地方了。还需要将BusRegistry builder.RegisterType()注册为().SingleInstance();注意:我通过添加服务完成了下面建议的修复。AddMassTransitHostedService();到我的ConfigureServices方法,但还需要注册它的依赖项生成器。RegisterType().As().SingleInstance();注意:我通过添加服务完成了下面建议的修复。AddMassTransitHostedService();到我的ConfigureServices方法,但还需要注册它的依赖项生成器。RegisterType().As().SingleInstance();