当前位置: 首页 > 知识库问答 >
问题:

如何使用自定义中间件获得响应正文?

詹钊
2023-03-14

问题

如何使用自定义中间件在调用下一个上下文时获取响应正文?

到达await _next行后。从调试中调用(上下文);

不从操作结果返回 JSON 数据 获取用户菜单

[HttpGet(Contracts.ApiRoutes.Security.GetUserMenus)]
 public IActionResult GetUserMenu(string userId)
        {
            string strUserMenus = _SecurityService.GetUserMenus(userId);
            return Ok(strUserMenus);
        }

我需要从上面的操作结果中得到响应体。

header :
key : Authorization
value : ehhhheeedff .

我的代码我试试:

public async Task InvokeAsync(HttpContext context, DataContext dataContext)
        {


            // than you logic to validate token              

            if (!validKey)
            {
                context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
                await context.Response.WriteAsync("Invalid Token");
            }
            //if valid than next middleware Invoke
            else
            {
                await _next.Invoke(context);
// i need after that get result on last of thread meaning return data of usermenu

            }
        }
    }
 public static class TokenExtensions
    {
        public static IApplicationBuilder UseTokenAuth(this IApplicationBuilder builder)
        {
              return builder.UseMiddleware<TokenValidateMiddleware>();

        }
    }


          [no return data from access token][1]

https://i.stack.imgur.com/PHUMs.png

if(validtoken)
{
continue display getusermenuaction and show result

}

当有效令牌时,它会在浏览器谷歌上返回如下数据

[
  {
    "form_name": "FrmAddPrograms",
    "title": "Adding Screens",
    "url": "",
    "permissions": {
      "Insert": "True",
      "Edit": "True",
      "Read": "True",
      "Delete": "True",
      "Print": "True",
      "Excel": "False",
      "RecordList": "False"
    }
  },

但在我的应用程序浏览器上返回无效令牌

共有1个答案

伍捷
2023-03-14

尝试使用以下代码在自定义中间件中获取响应主体:

public class CustomMiddleware
{
    private readonly RequestDelegate next;

    public CustomMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task Invoke(HttpContext context)
    {

        if (!validKey)
        {
            context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
            await context.Response.WriteAsync("Invalid Token");
        }
        //if valid than next middleware Invoke
        else
        {
            Stream originalBody = context.Response.Body;

            try
            {
                using (var memStream = new MemoryStream())
                {
                    context.Response.Body = memStream;

                    await next(context);

                    memStream.Position = 0;
                    string responseBody = new StreamReader(memStream).ReadToEnd();//get response body here after next.Invoke()

                    memStream.Position = 0;
                    await memStream.CopyToAsync(originalBody);
                }

            }
            finally
            {
                context.Response.Body = originalBody;
            }
        }          
    }
}
 类似资料:
  • 问题内容: 我正在使用和自定义字体选择器。我希望显示所有可用的字体,每种字体名称以其自己的字体显示。我目前使用大约500种字体。 提供此功能的的示例: 问题在于,使用此渲染器时,在程序执行过程中,对象将变得无响应。第一次单击组合框以显示列表时,加载列表需要花费几秒钟的时间。第二次单击时,列表立即显示。 如果有人评论这一行 ,组合框就可以了。 如何防止这种反应迟钝? 问题答案: 发生的是,组合的内部

  • 问题内容: 我想拥有一个独立的PHP类,在这里我想拥有一个通过cURL调用API并获取响应的函数。有人可以帮我吗? 谢谢。 问题答案: 只需使用下面的代码即可获得来自宁静的Web服务URL的响应,而我使用的是社交提及URL。

  • 我有以下代码: 如果我提供的所有参数都正确-enpoint会像邮递员应用程序一样返回200个http stsatus代码。 但是如果我提供了错误的url-我看到异常: 但是当我以同样的方式在postman中修改url时——我看到404错误: 我想有像邮递员一样的回应和像邮递员一样的回应。 如果我提供而不是,我会得到正确的,我可以在其中提取我想要的数据: 如何编写将提取和的通用代码? 重新模板初始化

  • 如何将此Json响应转换为改装bean我得到了Gson错误,就像使用JsonReader一样。setLenient(true)在第1行第1列路径接受格式错误的JSON$ api调用为 字符串CATEGORY\u API=“”https://api.callingservice.com"; 请帮助我解决这个问题,如何将Json响应转换为Bean,我的Bean类如下

  • 问题内容: 我确实获得了响应数据,但是无法获得自定义HTTP标头数据。 是的,这是一个跨域请求。我正在用Javascript执行Ajax请求。我已经尝试过XMLHttpRequest和jQuery $ .ajax。我已经完成了服务器设置,在发送数据时已进行了以下设置: 我 确实 得到了想要的响应数据。但是我无法获得完整的HTTP标头响应。 使用PHP,我在发送文本响应之前设置了以下内容。因此,我假

  • 问题内容: 我在这里使用答案来尝试通过数据上传进行请求,但是服务器端有不同寻常的要求。该服务器是一个PHP脚本,需要对行,因为它是期待一个文件上传。 但是,在客户端,我想发布一个内存中的缓冲区(在这种情况下为String)而不是文件,但是让服务器像对待文件上传一样处理它。 但是,使用I无法在行上添加必填字段。因此,我尝试使用,但这只是将其放在单独的行上。 我如何才能进入一行,而无需先将其写入文件然