8

リクエストからルート テンプレートを取得しようとしています。私は OwinMiddleware を使用しており、IOwinContext を受け入れる Invoke メソッドをオーバーライドしています。

public override async Task Invoke(IOwinContext context)
{
    ...
}

リクエスト 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);

参考のため:

これは、別のプロジェクトに正常に実装した HttpRequestMessage を使用してこれを行う方法に関する投稿です

4

1 に答える 1

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

次のようにミドルウェアを登録します。

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

    app.Use<RouteTemplateMiddleware>(_httpConfiguration.Routes);
    ...
}
于 2018-03-02T23:34:03.757 に答える