提问者:小点点

如何使用 asp.net 核心 2 中间件包装 graphql.net endpoint响应?


我使用 asp.net web api2 开发了 REST API。我正在使用核心 2 将 REST API 迁移到 GraphQL.net asp.net endpoint。在现有的 REST API 代码中,我有一个委托处理程序,用于使用其他数据扩展 REST API 调用的结果,在本例中,这些数据将本地化数据添加到响应中。由于核心 2 不再支持委派处理程序 asp.net 因此。我正在尝试将现有的委派处理程序迁移到中间件组件。

作为参考目的,我遵循了中提到的细节:使用 OWIN 中间件扩展 WebApi 响应和 https://www.devtrends.co.uk/blog/wrapping-asp.net-web-api-responses-for-consistency-and-to-provide-additional-information

在这里,我有几个疑问:

>

  • 如何在 Middlware 的情况下映射以下代码? var response = await base。发送异步(请求,取消令牌);

    我应该将中间件放在启动.cs配置方法中的什么位置。

    相当于现有委派处理程序的中间件

    法典:

    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个答案

    匿名用户

    请阅读 ASP.NET 核心中间件文档,以更好地了解中间件的工作原理。

    中间件在其构造函数中接收下一个请求委托,并支持调用方法。例如:

     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问题:

    在核心 Web API 中注册新的委派处理程序 ASP.NET

    如何包装 Web API 响应(在 .net 核心中)以实现一致性?