【发布时间】: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