How can I wrap Web API responses(in .net core) for consistency?

后端 未结 4 1533
误落风尘
误落风尘 2020-12-14 18:27

I need to return a consistent response with a similar structure returned for all requests. In the previous .NET web api, I was able to achieve this using DelegatingHandler (

4条回答
  •  春和景丽
    2020-12-14 19:12

    I created a middleware to wrap the response for consistency. I also created an extension method to IApplicationBuilder for convenience when registering this middleware. So in Startup.cs, register middleware :

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

    And here's the middleware code:

    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();
            }
        }
    
    
        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;
            }
        }
    }
    

提交回复
热议问题