【发布时间】:2023-02-24 14:22:32
【问题描述】:
我创建了一个中间件,允许我拦截对我的 API 的每次调用。当请求是 HttpStatus.Ok 或 HttpStatus.BadRequest 时,我的代码总是返回相同类型的响应。 中间件只是“转发”响应而没有任何变化
这是我在所有情况下都拥有并希望拥有的标准回复:
{
"results": 0,
"numberOfRows": 1,
"requestGuid": "xxx",
"errors": [],
"StatusCode": 200,
"environment": "LOC"
}
我的 Api 端点需要通过 Body 获得一些属性。有些属性是强制性的。 例如,如果我通过邮递员发送呼叫并“忘记”强制属性,我会收到来自 api 的标准消息,如下所示:
{
"errors": {
"MyProp": [
"The MyProp field is required."
]
},
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "xxx"
}
正常消息,但是,这是我想使用我的标准响应来标准化的消息。
这是我的中间件的代码
public async Task InvokeAsync(HttpContext context)
{
try
{
Stream originalBodyStream = context.Response.Body;
await using (MemoryStream memoryStream = new())
{
context.Response.Body = memoryStream;
await _next(context);
if (context.Response.StatusCode == 400)
{
//??
}
else
{
memoryStream.Seek(0, SeekOrigin.Begin);
string responseBodyText = await new StreamReader(memoryStream).ReadToEndAsync();
// memoryStream.Seek(0, SeekOrigin.Begin);
context.Response.Body = originalBodyStream;
await context.Response.Body.WriteAsync(memoryStream.ToArray());
}
}
}
catch (Exception exception)
{
//todo
}
}
else 语句“转发”我创建的响应,但是当我进入 if 语句时我不知道如何发送新主体,“标准”响应是这个对象:
Response\<HttpStatusCode\> errorResponse = new()
{
StatusCode = HttpStatusCode.BadRequest,
Errors = new List\<ErrorsModel\>
{
new()
{
ErrorDetail = "test"
}
}
};
【问题讨论】:
标签: asp.net-core exception asp.net-web-api