由于Post中的application/jwt而出现UnsupportedContentTypeException

问题描述 投票:0回答:1

我正在使用 .NET 6.0,并且有一个简单的 API 控制器来从第 3 方网站接收 POST。然而,他们使用 Content-Type application/jwt 进行发布,根据跟踪日志,我收到了“UnsupportedContentTypeFilter”异常。

如果需要,我可以发布代码,但如果我使用邮递员并将 Content-Type 设置为 application/jwt,我会得到类似的结果。

举例说明:

public class GlassfyController : ControllerBase
{
    [HttpPost("ReceiveWebHook")]
    public async Task<ActionResult> ReceiveWebHook([FromBody]GlassfyWebHookRequest req)
    {
       return Ok();
    }
}

如果我用邮递员的 application/json 发布到此,它工作正常。但是,如果我向其发送 Glassfy 帖子,它会返回 HTTP 415。

通过查看日志,我注意到它是来自 Glassfy 的 application/jwt。我无法真正控制这一点,有什么方法可以让模型绑定器识别 application/jwt 吗?

例外情况是:

拒绝内容类型“application/jwt”的输入格式化程序“Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonInputFormatter”。

根据微软的文档,它说:

UnsupportedContentTypeException 当请求正文的模型绑定器无法理解请求内容类型标头时添加到模型状态的异常。

https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.modelbinding.unsupportedcontenttypeexception?view=aspnetcore-8.0

任何帮助将不胜感激!顺便说一句,它并没有让我无法理解 JWT 与 POST 请求的关系,除了他们应该只是添加 JWT 令牌作为承载(通过 IIS 运行它并拉取失败的请求跟踪日志) ,我可以看到它)..并提供一个 URL 来验证它。由于 415,我什至无法接到登陆电话。这也很可疑,因为当我从授权承载中提取令牌并将其放入 JWT 解码器时,我只得到前两部分,它完全缺少第三部分。我肯定有一个根本性的误解。不过,我的问题的核心是如何让 .net core 接受 Content-Type: application/jwt 因为显然我需要接收它。

c# .net asp.net-core asp.net-web-api jwt
1个回答
0
投票

我的问题的核心是如何让.net core接受Content-Type: application/jwt,因为显然我需要接收它。

您可以创建并使用自定义输入格式化程序来实现需求。

您可以参考以下代码演示如何实现自定义格式化程序:

public class MyJwtInputFormatter : TextInputFormatter
{
    public MyJwtInputFormatter() 
    {
        SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/jwt"));

        SupportedEncodings.Add(Encoding.UTF8);
        SupportedEncodings.Add(Encoding.Unicode);
    }
    public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
    {
        string data = null;
        using (var streamReader = new StreamReader(context.HttpContext.Request.Body))
        {
            data = await streamReader.ReadToEndAsync();
            //...
            //your code logic here to extract required info from posted data
            //...
        }

        var webHookRequestData = new GlassfyWebHookRequest { Description = "data extracted from request" };

        return InputFormatterResult.Success(webHookRequestData);
    }
}

配置应用程序以使用自定义格式化程序

builder.Services.AddControllers(opt => {
    opt.InputFormatters.Insert(0, new MyJwtInputFormatter());
});
© www.soinside.com 2019 - 2024. All rights reserved.