【问题标题】:Simple app.map() not working MVC core简单的 app.map() 不工作 MVC 核心
【发布时间】:2018-03-10 22:44:54
【问题描述】:

在 Startup.cs 我有一个非常简单的地图

app.Map("/Home",x=>x.UseMiddlewareLogic1() );

我的完整配置代码如下所示

public void Configure(IApplicationBuilder app)
        {
            app.Map("/Home",x=>x.UseMiddlewareLogic1() );
            //app.UseMiddlewareLogic1();
            //app.UseMiddlewareLogic2();
            app.Run(async context =>
             Logic3(context));
        }

逻辑3只是如下所示的响应写入

 public async Task Logic3(HttpContext obj)
        {
            await obj.Response.WriteAsync("Logic 3\n");

        }

上面的代码显示 404 not found。 中间件逻辑类是 Visual Studio 模板中的标准类。我正在使用 VS 2017。

 public class MiddlewareLogic1
    {
        private readonly RequestDelegate _next;

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

        public async Task Invoke(HttpContext httpContext)
        {
            await httpContext.Response.WriteAsync("This is logic123 \n");
            await _next(httpContext);
        }
    }

    // Extension method used to add the middleware to the HTTP request pipeline.
    public static class MiddlewareLogic1Extensions
    {
        public static IApplicationBuilder UseMiddlewareLogic1(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<MiddlewareLogic1>();
        }

    }

【问题讨论】:

  • 您的Configure 方法中还有其他内容吗?具体来说,app.Map(...)?之后
  • 是的,我确实有 app.run(更新代码),我正在将最终输出写入响应。

标签: model-view-controller asp.net-core


【解决方案1】:

这是你的问题:app.Map("/Home",x=&gt;x.UseMiddlewareLogic1() );

如果您使用app.Map,框架将不会在Map 分支之外执行中间件(在app.Map 之后注册的中间件 - 中间件的顺序很重要)。相反,它将自动终止。换句话说,您永远不需要在.Map 中使用.Run 来终止管道。

您得到 404,因为在 MiddlewareLogic1 中使用的 MiddlewareLogic1 中间件中有 await _next(httpContext);Map,但在此 Map 分支中没有注册其他管道。 如果您删除 await _next(httpContext);,您将看到回复 "This is logic123 而不是 404。


更新.Map.MapThen 具有相同的终止行为。作为解决方案,您可以考虑 - 将.Map 替换为.Use 并在内部进行查询比较登录。 - 或者在.app.Map注册一个单独的中间件链。

【讨论】:

  • 上面的文章看起来很基础。它没有回答我的问题。当我把这个 app.MapWhen(context => context.Request.QueryString.Value.StartsWith("/home123"), x => x.UseMiddlewareLogic1());只有 Logic3 执行。
  • 但是是的,我可以理解中间件标准代码是为简单场景创建的,因此不适用于此。我需要修改它。
  • 是的,它们都有终止行为。你能更新你的答案我会标记它谢谢。
  • +1 来自我。关于具有相同终止行为的 .Map、MapThen(和 MapWhen)的提示解决了我的问题。条件检查最好使用 app.UseWhen 注入管道,它会分支并连接回主请求管道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多