RoutePattern 如何添加到 Endpoint 对象

How RoutePattern is added to an Endpoint object

下面是一些简单的代码

public class Startup {
   public void ConfigureServices(IServiceCollection services) {
   }

   public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
      app.UseDeveloperExceptionPage();

      app.UseRouting();

      app.Use(async (context, next) => {
         var endpoint = context.GetEndpoint();  // <--------I put a debugger here
         await next();
      });

      app.UseEndpoints(endpoints => {
         endpoints.MapGet("routing", async context => {
            await context.Response.WriteAsync("Request Was Routed");
         });
      });
      app.Use(async (context, next) => {
         await context.Response.WriteAsync("Terminal Middleware Reached");
      });
   }
}

遇到断点时,我可以看到一些属性已添加到 Endpoint 实例中,例如 RoutePattern 属性

但是Endpoint没有RoutePattern属性:

public class Endpoint {
   public Endpoint(RequestDelegate requestDelegate, EndpointMetadataCollection metadata, string displayName);
   public string DisplayName { get; }
   public EndpointMetadataCollection Metadata { get; }
   public RequestDelegate RequestDelegate { get; }

   public override string ToString();

那么RoutePattern属性是如何添加到Endpoint实例中的呢?

另一个问题是,当我运行应用程序时,断点总是命中两次,而不是一次,这是为什么,因为只有一个请求,断点应该只命中一次?

Endpointclass确实没有RoutePattern属性,但是childclassRouteEndpoint有这个属性(Microsoft.AspNetCore.Routing.RouteEndpoint),当你在debugger的时候看,就可以看到了。

为什么要点击两次,恐怕是你的应用程序中有其他代码导致的,在我新创建的 asp.net 核心 MVC 应用程序中,当应用程序启动时,它只点击了一次,但是在我的signalr mvc项目中,因为连接了signalr,所以命中了两次。所以我认为你需要检查你的代码。

顺便说一句,这篇关于 middleware execution order 的文档可能会有所帮助。