从IOwinContext获取路由模板

sco*_*stl 7 c# asp.net-web-api owin owin-middleware

我希望从请求中获取路由模板.我正在使用OwinMiddleware并且重写了接受IOwinContext的Invoke方法.

public override async Task Invoke(IOwinContext context)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

给定请求URL:http://api.mycatservice.com/Cats/1234

我想得到" Cats/{CatId} "

我尝试使用以下方法转换它失败了:

HttpRequestMessage msg = new HttpRequestMessage(new HttpMethod(context.Request.Method), context.Request.Uri);

HttpContextBase httpContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);
Run Code Online (Sandbox Code Playgroud)

以供参考:

这是一篇关于如何使用HttpRequestMessage执行此操作帖子,我已成功为另一个项目实现了该功能

dst*_*stj 4

我有同样的问题,这似乎有效。有点神奇,但到目前为止还不错:

public class RouteTemplateMiddleware : OwinMiddleware
{
    private const string HttpRouteDataKey = "MS_SubRoutes";
    private readonly HttpRouteCollection _routes;

    public RouteTemplateMiddleware(OwinMiddleware next, HttpRouteCollection routes) : base(next)
    {
        _routes = routes;
    }

    public override async Task Invoke(IOwinContext context)
    {
        var routeData = _routes.GetRouteData(new HttpRequestMessage(new HttpMethod(context.Request.Method), context.Request.Uri));
        var routeValues = routeData?.Values as System.Web.Http.Routing.HttpRouteValueDictionary;

        var route = routeValues?[HttpRouteDataKey] as System.Web.Http.Routing.IHttpRouteData[];
        var routeTemplate = route?[0].Route.RouteTemplate;

        // ... do something the route template

        await Next.Invoke(context);
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样注册中间件:

public void Configuration(IAppBuilder app)
{
    _httpConfiguration = new HttpConfiguration();
    _httpConfiguration.MapHttpAttributeRoutes();
    ...

    app.Use<RouteTemplateMiddleware>(_httpConfiguration.Routes);
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 点赞是不够的,他们应该为此添加一个拥抱按钮。 (3认同)