Доступ к временным данным в промежуточном программном обеспечении в asp.net 5.0 проект веб-api

#c# #asp.net-mvc #asp.net-web-api #middleware #tempdata

Вопрос:

У меня есть два приложения, запущенных одновременно. Я пытался найти способ использовать TempData класс моего собственного типа, и после прочтения я реализовал его в своем промежуточном программном обеспечении для своего проекта MVC, который работает бесперебойно. Однако, когда я копирую код промежуточного программного обеспечения из своего проекта MVC в свое промежуточное программное обеспечение для моего asp.net проект веб-api не работает. Когда я запускаю программы вместе, и когда он вызывает проект веб-api, он возвращает следующий веб-api (MVC работает нормально, я не получаю никаких ошибок по этому поводу):

Исключение InvalidOperationException: Не удается разрешить службу для типа » Microsoft.AspNetCore.Mvc.Возможности просмотра.ITempDataDictionaryFactory «при попытке активировать» AddressService.API.Промежуточное программное обеспечение.CorrelationIdMiddleware».

введите описание изображения здесь

До того, как я реализовал функцию TempData ( ITempDataDictionaryFactory ) в промежуточном программном обеспечении моего проекта web api, она работала нормально… но после внедрения ITempDataDictionaryFactory в него он выдает мне эту ошибку. Есть ли что-то, что я должен сделать, чтобы это работало так, как в моем промежуточном программном обеспечении для моего проекта MVC?

Middleware в моем проекте веб-api:

     public class CorrelationIdMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly ILogger _logger;
        private readonly ITempDataDictionaryFactory _tempDataDictionaryFactory;
        public CorrelationIdMiddleware(RequestDelegate next, ILoggerFactory loggerFactory, ITempDataDictionaryFactory tempDataDictionaryFactory)
        {
            _next = next;
            _logger = loggerFactory.CreateLogger<CorrelationIdMiddleware>();
            _tempDataDictionaryFactory = tempDataDictionaryFactory;
        }

        public async Task Invoke(HttpContext context)
        {
            string correlationId = null;
            string userName;
            string ipAddress;

            var tempData = _tempDataDictionaryFactory.GetTempData(context);

            var key = context.Request.Headers.Keys.FirstOrDefault(n => n.ToLower().Equals("x-correlation-id"));
            if (!string.IsNullOrWhiteSpace(key))
            {
                correlationId = context.Request.Headers[key];
                _logger.LogInformation("Header contained CorrelationId: {@CorrelationId}", correlationId);
            }
            else
            {
                if (tempData.ContainsKey("username") amp;amp; tempData.ContainsKey("ipaddress"))
                {
                    userName = tempData.Peek("username").ToString();

                    ipAddress = tempData.Peek("ipaddress").ToString();

                    context.Response.Headers.Append("X-username", userName);
                    context.Response.Headers.Append("X-ipAddress", ipAddress);
                }

                correlationId = Guid.NewGuid().ToString();
                _logger.LogInformation("Generated new CorrelationId: {@CorrelationId}", correlationId);
            }
            context.Response.Headers.Append("x-correlation-id", correlationId);
            using (LogContext.PushProperty("CorrelationId", correlationId))
            {
                await _next.Invoke(context);
            }
        }
 

CorrelationIdExtensions.cs (используется для вызова app.UseCorrelationId() при запуске):

 public static class CorrelationIdExtensions
{
    public static IApplicationBuilder UseCorrelationId(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<CorrelationIdMiddleware>();
    }
}
 

Startup.cs :

     public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "AddressService.API", Version = "v1" });
            });

           services.AddHttpContextAccessor();
        }

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

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseSwagger();
                app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "AddressService.API v1"));
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

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

Ответ №1:

Одним из способов решения этой проблемы должно быть использование:

 services.AddControllersWithViews();
 

или

 services.AddMvc();
 

Вместо services.AddControllers(); .

Комментарии:

1. Я попробовал это с помощью первого метода, и это сработало! Спасибо!