当前位置: 首页 > 知识库问答 >
问题:

添加自定义中间件时使用IMiddleware不起作用

高勇
2023-03-14
public class RequestCultureMiddleware
{
    private readonly RequestDelegate _next;

    public RequestCultureMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        CultureInfo.CurrentCulture = new CultureInfo("es-ES");
        CultureInfo.CurrentUICulture = new CultureInfo("es-ES");

        // Call the next delegate/middleware in the pipeline
        await _next(context);
    }
}

public static class RequestCultureMiddlewareExtensions
{
    public static IApplicationBuilder UseRequestCulture(
        this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<RequestCultureMiddleware>();
    }
}

和启动类:

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();
    }

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

        //here is our custom middleware!
        app.UseRequestCulture();

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthorization();

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

这很好,但是正如您所看到的,RequestCultureMiddleware没有实现接口或基类/抽象类。您只需要记住,在定义中间件时创建接收下一个中间件的构造函数,还需要创建一个专门名为“InvokeAsync”的方法,并将“HttpContext”作为参数。

我想找份合同...基类或接口,猜猜看,我们有“imiddleware”,它是“Microsoft.aspnetcore.http”程序集的一部分。哇,太完美了。让我们来实施它。

namespace Microsoft.AspNetCore.Http
{
    //
    // Summary:
    //     Defines middleware that can be added to the application's request pipeline.
    public interface IMiddleware
    {
        //
        // Summary:
        //     Request handling method.
        //
        // Parameters:
        //   context:
        //     The Microsoft.AspNetCore.Http.HttpContext for the current request.
        //
        //   next:
        //     The delegate representing the remaining middleware in the request pipeline.
        //
        // Returns:
        //     A System.Threading.Tasks.Task that represents the execution of this middleware.
        Task InvokeAsync(HttpContext context, RequestDelegate next);
    }
}
    public class RequestCultureMiddleware : IMiddleware
    {

        public Task InvokeAsync(HttpContext context, RequestDelegate next)
        {
            CultureInfo.CurrentCulture = new CultureInfo("es-ES");
            CultureInfo.CurrentUICulture = new CultureInfo("es-ES");

            // Call the next delegate/middleware in the pipeline
            return next(context);
        }
    }


    public static class RequestCultureMiddlewareExtensions
    {
        public static IApplicationBuilder UseRequestCulture(
            this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<RequestCultureMiddleware>();
        }
    }
}
System.InvalidOperationException: No service for type 'WebApplication1.RequestCultureMiddleware' has been registered.
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at Microsoft.AspNetCore.Http.MiddlewareFactory.Create(Type middlewareType)
   at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.<>c__DisplayClass5_1.<<UseMiddlewareInterface>b__1>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

共有1个答案

东方震博
2023-03-14

我敢肯定这个问题在5个月后早就解决了,但我写这个建议以防万一。

问题是您的自定义中间件程序的“invokeAsync”方法无法执行,即使您在启动的“configure”方法中内置了它。

前几天我遇到了同样的问题,并通过以下方法解决了它,但是我把内置代码放在了app.useEndpoints方法之前。

app.UseAuthorization();
app.UseRequestCulture();  // <- this way.
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
});
 类似资料:
  • 使用Apache POI向XLSX文件添加自定义XML部分的正确方法是什么? 我尝试使用下面的代码创建包部分并将关系添加到工作簿,但由于工作簿清除了中的包部分,所以我新添加的部分被添加为空文件。

  • 我在Angular中有一个自定义验证的表单构建器,但我在自定义验证中读取文件后无法获取文件的类型。 下面是StackBlitz: https://stackblitz.com/edit/Angular-ivy-atwqqc?file=src%2fapp%2fapp.component.ts TS文件

  • 验证,我正在尝试为我的文本字段创建多个规则,例如:required、minlength、maxLength,并将它们链接在一起,并根据这些规则将h参数传递给preform validation 所以我试着用文档中的例子: http://vee-validate.logaretm.com/v2/guide/custom-rules.html#args-and-rule-configuration 我

  • 字体始终显示默认字体。 我的字体存储在资源/字体中。我尝试使用其他字体,并对字体进行重新编码。此外,PixlUI库并没有解决这个问题。 主要活动。Java语言 activity\u main。xml

  • 我想把x-frame-options添加到AWS CloudFront服务中,作为在S3桶上为我的应用程序提供服务的原点。 我不想添加新的Lambda函数来编辑请求头。 其实我在附文件下面找到了一个地方: 我如何在没有Lambda函数的情况下直接使用现有的AWS CloudFront面板来添加头?

  • 我是WebSphere Liberty概要文件的新手。我正在编写17.0.0.4版本。我试图实现的是为应用程序设置自定义JAAS登录设置。该应用程序在WebSphere8.5上运行良好。 我已经查看了IBM知识中心的许多链接,但得到了JAAS自定义登录的结果,但不是两者一起。在WebSphere 8.5中,我们有层次结构来决定哪个身份验证机制去哪里,但是在Liberty中,如果我设置自定义JAAS