【问题标题】:.net core middleware automatically sets the content type to application/json; charset=utf-8.net核心中间件自动将内容类型设置为application/json;字符集=utf-8
【发布时间】:2019-11-15 08:43:48
【问题描述】:

我在我的 asp.net core (3.0 SDK) Web API 应用程序中创建了一个中间件。我在中间件中面临一个奇怪的问题。当 _next.Invoke(context) 完成执行时,它将内容类型设置为 application/json; charset=utf-8 虽然标题中没有指定。

中间件代码如下:

 public async Task InvokeAsync(HttpContext context)
        {
            var originalBodyStream = context.Response.Body;

            using (var newBodyStream = new MemoryStream())
            {

                try
                {
                    context.Response.Body = newBodyStream;
                    var contentTypeBefore = context.Response.ContentType; //Returns null

                    await _next.Invoke(context);

                   var contentTypeAfter = context.Response.ContentType; //Returns application/json; charset=utf-8

                    context.Response.Body = originalBodyStream;

                    if (context.Response.StatusCode != (int)HttpStatusCode.OK)
                    {
                        await HandleNotSuccessRequestAsync(context, context.Response.StatusCode);
                    }
                    else
                    {
                        string bodyAsText = await FormatResponse(newBodyStream);
                        await HandleSuccessRequestAsync(context, bodyAsText, context.Response.StatusCode);
                    }


                }
                catch (Exception ex)
                {
                    await HandleExceptionAsync(context, ex);
                    newBodyStream.Seek(0, SeekOrigin.Begin);
                    await newBodyStream.CopyToAsync(originalBodyStream);
                }


            }
        }

而我正在从我的控制器返回 StatusCode,如下所示:

        [HttpGet]
        public async Task<IActionResult> Get()
        {
            ApiResponseModel<IEnumerable<CompanyMasterDto>> apiResponseModel;
            apiResponseModel = await _repository.CompanyMasterRepository.GetAllCompaniesAsync();
            return StatusCode(apiResponseModel.ErrorCode, apiResponseModel);
        }

注意:如果我在执行以下语句后尝试检索 contentTypeAfter 值不会有任何区别

 context.Response.Body = originalBodyStream;

上述代码有什么问题吗?因为内容类型的变化将成为处理内容协商或中间件中的其他内容时的障碍。

特此发布输出窗口中的一些消息,我认为这可能有助于找出问题:

尝试根据 Accept header '/' 和明确指定的内容类型 'application/json; charset=utf-8'。

未找到内容类型“application/json;”的输出格式化程序;字符集=utf-8,应用程序/json; charset=utf-8' 来写响应。

【问题讨论】:

    标签: asp.net-core asp.net-core-3.0


    【解决方案1】:

    我认为你的代码很好。

    默认情况下,asp.net core 总是返回application/json; charset=utf-8 类型。如果添加代码,您可以返回其他格式,例如 XML

    services.AddMvc()
        .AddXmlSerializerFormatters();
    

    并添加一个Accept 标头,其值为application/xml

    这个微软文档可以更好地解释它https://docs.microsoft.com/en-us/aspnet/core/web-api/advanced/formatting?view=aspnetcore-3.0

    【讨论】:

    • 我的代码中已经包含了它。 as ` services.AddControllers(options => { //接受浏览器头。options.RespectBrowserAcceptHeader = true; }). AddXmlSerializerFormatters()。 AddXmlDataContractSerializerFormatters()。 ` 是否有任何选项可以将其设置为 application/json 而不是 application/json; charset=utf-8 如果没有指定标题,默认情况下?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2013-05-09
    • 2011-08-09
    • 2012-02-28
    • 2013-01-02
    • 2018-07-24
    • 1970-01-01
    相关资源
    最近更新 更多