ASP.NET Core Middleware и парсинг URL - PullRequest
0 голосов
/ 15 марта 2019

Попытка добавить специальные конечные точки в ASP.NET Core MVC через промежуточное ПО.

В app.UseWhen мне нужно проанализировать URL-адрес запроса.В контексте контроллера, MVC отлично справляется с извлечением userId, используя следующий шаблон:

GET http://contoso.com/users/{userId}/addresses

Как это можно было бы сделать чисто в промежуточном программном обеспечении, где конструкции контроллера MVC неsetup?

Бонусные баллы, если ответ помогает выяснить, соответствует ли адрес в первую очередь этому шаблону.

Все, что у меня есть, это DefaultHttpContext .

Ответы [ 3 ]

0 голосов
/ 15 марта 2019

Вы можете получить доступ к HttpContext из промежуточного программного обеспечения и проанализировать пары ключ-значение из строки запроса, но вы не можете получить доступ к параметрам пути через ключ-значение.

Например:

Вы делаете GET для следующего контроллера через http://contoso.com/api/users/5?zip=90210:

 // GET api/users/5
[HttpGet("{id}")]
public ActionResult<string> Get(int id)
{
    return "value";
}

Пользовательское промежуточное ПО:

public class MyCustomMiddleware
{
    public Task InvokeAsync(HttpContext context)
    {   
        // get full path from context request path
        var queryPath = context.Request.Path().ToString(); 
        // will return /api/users/5

        // get id from query string
        var queryStringId = context.Request.Query["zip"].ToString();
        // will return 90210
    }
}

Нет никакого сопоставления между параметрами вашего контроллера и HttpContext.

0 голосов
/ 20 марта 2019

Решение на основе Блог Марка Винча

Этот метод используется для извлечения идентификатора пользователя и работы с ним ...

    private static void AddAddressesRoute(IApplicationBuilder app, RouteBuilder builder)
    {
        builder.MapVerb(
            HttpMethod.Get.Method,
            "users/{userId}/addresses",
            async context =>
            {
                var routeData = context.GetRouteData();
                var userId = routeData.Values["userId"];

                // userId available from here
            }
        );
    }

Должен быть инициирован изметод расширения компоновщика приложений.

    public static IApplicationBuilder UseAddresses(
        this IApplicationBuilder app
    )
    {
        RouteBuilder builder = new RouteBuilder(app);

        AddAddressesRoute(app, builder);

        app.UseRouter(builder.Build());

        return app;
    }

Становится промежуточным программным обеспечением, которое может быть добавлено к методу Startup.Configure следующим образом:

    app.UseAddresses()

Это даже не мешает MVC, которыйпо-прежнему срабатывает, если маршрут не совпадает.

0 голосов
/ 15 марта 2019
Синтаксический анализ

URL начинается в MVC конвейере, а не в ASP.NET Core.

Возможно, вы захотите рассмотреть MVC фильтры , которые имеют доступ к контексту маршрутизации.

...