Как обернуть ответ оконечной точки graphql.net, используя промежуточное ПО asp.net core 2? - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть REST API, разработанный с использованием asp.net web api2. Я выполняю миграцию REST API на конечные точки GraphQL.net с помощью ядра asp.net 2. В существующем коде REST API у меня есть обработчик делегирования, который используется для расширения результата вызова REST API дополнительными данными, которые в данном случае являются добавлением данных локализации в ответ. Поскольку обработчик делегирования больше не поддерживается в ядре asp.net 2. Я пытаюсь перенести существующий обработчик делегирования на компонент Middleware.

В справочных целях я следовал деталям, указанным по адресу: Расширение ответа WebApi с помощью промежуточного программного обеспечения OWIN и https://www.devtrends.co.uk/blog/wrapping-asp.net-web-api-responses-for-consistency-and-to-provide-additional-information

Здесь у меня есть пара запросов:

  1. Как отобразить код ниже в случае Middlware? var response = ожидание base.SendAsync (запрос, cancellationToken);

  2. Где разместить промежуточное программное обеспечение в методе Startup.cs Configure.

  3. Промежуточное программное обеспечение, эквивалентное существующему делегирующему обработчику

Код:

public class CommonResponserHandler : DelegatingHandler
{
    ICommonService _commonService = new CommonService();
    protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        string locale = string.Empty;
        if (request.Headers.Contains("Accept-Language"))
        {
            locale = request.Headers.GetValues("Accept-Language").First();
        }

        bool initialAuthorizationStatus = GetInitialAuthorization(request);
        var response = await base.SendAsync(request, cancellationToken);
        APIResult commonResponse;
        if (response.TryGetContentValue<APIResult>(out commonResponse))
        {
            //populate common response here;
            UpdateCommonResponse(request, response, commonResponse);
            //UpdateCommonResponse(basicResponse, commonResponse);
            HttpResponseMessage newResponse;
            bool authorizatinCheckResult = AssertAuthorization(initialAuthorizationStatus, request);
            if (authorizatinCheckResult)
            {
                newResponse = request.CreateResponse(response.StatusCode, commonResponse);
            }
            else
            {
                var unAuthorisedResult = new APIResult{Authorized = false, UserMessage = Constants.Unauthorized, Locale = new Locale(_commonService.GetLanguageFromLocale(locale))};
                newResponse = request.CreateResponse(HttpStatusCode.Unauthorized, unAuthorisedResult);
                var jsonSerializerSettings = new JsonSerializerSettings{ContractResolver = new CamelCasePropertyNamesContractResolver()};
                HttpContext.Current.Items["401message"] = JsonConvert.SerializeObject(unAuthorisedResult, Formatting.Indented, jsonSerializerSettings);
            }

            //Add headers from old response to new response
            foreach (var header in response.Headers)
            {
                newResponse.Headers.Add(header.Key, header.Value);
            }

            return newResponse;
        }

        return response;
    }
}

Может ли кто-нибудь помочь мне дать рекомендации по решению проблемы?

1 Ответ

0 голосов
/ 09 ноября 2018

Пожалуйста, прочитайте документацию по ASP.NET Core Middleware , чтобы лучше понять, как работает промежуточное ПО.

Промежуточное программное обеспечение принимает следующий RequestDelegate в своем конструкторе и поддерживает метод Invoke. Например:

 public class CommonResponserMiddleware
{
    private readonly RequestDelegate _next;

    public CommonResponserMiddleware(RequestDelegate next)
    {
        _next = next;

    }

    public async Task Invoke(HttpContext context)
    {
        //process context.Request

        await _next.Invoke(context);

        //process context.Response

    }
}

public static class CommonResponserExtensions
{
    public static IApplicationBuilder UseCommonResponser(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<CommonResponserMiddleware>();
    }
}

И использовать в Starup.cs:

public void Configure(IApplicationBuilder app) {
    //...other configuration

    app.UseCommonResponser();

    //...other configuration
}

Вы также можете обратиться к соответствующему вопросу SO:

Регистрация нового DelegatingHandler в ASP.NET Core Web API

Как обернуть ответы Web API (в ядре .net) для согласованности?

...