首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用graphql.net核心2中间件包装asp.net端点响应?

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

Stack Overflow用户
提问于 2018-11-08 19:00:09
回答 1查看 548关注 0票数 0

我使用asp.net web api2开发了REST。我正在使用REST核心2将REST迁移到GraphQL.net端点。在现有的REST代码中,我有一个委托处理程序,用于用附加数据扩展REST调用的结果,在本例中是将本地化数据添加到response.Since委托处理程序,在asp.net核心2中不再支持。我试图将现有的委托处理程序迁移到中间件组件。

为便于参考,我遵循了以下内容:使用OWIN中间件扩展WebApi响应https://www.devtrends.co.uk/blog/wrapping-asp.net-web-api-responses-for-consistency-and-to-provide-additional-information

在这里,我有几个问题:

  1. 如何在中间件的情况下映射下面的代码?变量响应=等待base.SendAsync(请求,cancellationToken);
  2. 我应该把中间件放在Startup.cs配置方法中。
  3. 与现有委托处理程序等效的中间件

代码:

代码语言:javascript
复制
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;
    }
}

有人能帮我解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2018-11-09 06:11:16

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

中间件在其构造函数中接受下一个RequestDelegate,并支持调用方法.For示例:

代码语言:javascript
复制
 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中使用:

代码语言:javascript
复制
public void Configure(IApplicationBuilder app) {
    //...other configuration

    app.UseCommonResponser();

    //...other configuration
}

您也可以参考相关的这样的问题:

在DelegatingHandler核心Web中注册一个新的ASP.NET

如何包装wrap响应(在.net核心中)以保持一致性?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53214456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档