gpt4 book ai didi

c# - 如何包装Web API响应(在.net核心中)以保持一致性?

转载 作者:行者123 更新时间:2023-12-03 14:53:03 25 4
gpt4 key购买 nike

我需要返回一个一致的响应,并为所有请求返回类似的结构。在以前的.NET Web API中,我能够使用DelegatingHandler(MessageHandlers)实现此目的。我要返回的对象将封装在Result元素中。因此,基本上json响应将采用这种结构:

范例1:

{
"RequestId":"some-guid-abcd-1234",
"StatusCode":200,
"Result":
{
"Id":42,
"Todo":"Do Hello World"
}
}

范例2:
{
"RequestId":"some-guid-abcd-1235",
"StatusCode":200,
"Result":
{
[
{
"Id":42,
"Todo":"Print Hello World"
},
{
"Id":43,
"Todo":"Print Thank you"
}
]

}
}

在.NET核心中,看来我需要通过中间件来执行此操作。我曾尝试过,但是当您可以调用 HttpResponseMessage.TryGetContentValue来获取内容并将其包装在全局/通用响应模型中时,我没有看到更好的方法来像在以前的Web API中那样提取内容。

如何在.NET Core中实现相同的目的?

最佳答案

我创建了一个中间件来包装响应以保持一致性。为了方便注册该中间件,我还为IApplicationBuilder创建了扩展方法。因此,在Startup.cs中,注册中间件:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
//code removed for brevity.
...
app.UseResponseWrapper();

//code removed for brevity.
...
}

这是中间件代码:
using System;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;

namespace RegistrationWeb.Middleware
{
public class ResponseWrapper
{
private readonly RequestDelegate _next;

public ResponseWrapper(RequestDelegate next)
{
_next = next;
}

public async Task Invoke(HttpContext context)
{
var currentBody = context.Response.Body;

using (var memoryStream = new MemoryStream())
{
//set the current response to the memorystream.
context.Response.Body = memoryStream;

await _next(context);

//reset the body
context.Response.Body = currentBody;
memoryStream.Seek(0, SeekOrigin.Begin);

var readToEnd = new StreamReader(memoryStream).ReadToEnd();
var objResult = JsonConvert.DeserializeObject(readToEnd);
var result = CommonApiResponse.Create((HttpStatusCode)context.Response.StatusCode, objResult, null);
await context.Response.WriteAsync(JsonConvert.SerializeObject(result));
}
}

}

public static class ResponseWrapperExtensions
{
public static IApplicationBuilder UseResponseWrapper(this IApplicationBuilder builder)
{
return builder.UseMiddleware<ResponseWrapper>();
}
}


public class CommonApiResponse
{
public static CommonApiResponse Create(HttpStatusCode statusCode, object result = null, string errorMessage = null)
{
return new CommonApiResponse(statusCode, result, errorMessage);
}

public string Version => "1.2.3";

public int StatusCode { get; set; }
public string RequestId { get; }

public string ErrorMessage { get; set; }

public object Result { get; set; }

protected CommonApiResponse(HttpStatusCode statusCode, object result = null, string errorMessage = null)
{
RequestId = Guid.NewGuid().ToString();
StatusCode = (int)statusCode;
Result = result;
ErrorMessage = errorMessage;
}
}
}

关于c# - 如何包装Web API响应(在.net核心中)以保持一致性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40748900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com