.net core 自定义规范响应的中间件

在本文中,我们将介绍如何使用 .NET Core 中的中间件来自定义规范响应,以便在 API 调用时返回统一的格式和错误信息。中间件是一种可以在请求和响应管道中执行逻辑的软件组件,它可以对请求或响应进行修改、拦截或处理。我们将使用一个简单的示例来演示如何创建和使用自定义规范响应的中间件。

首先,我们需要创建一个类来表示规范响应的格式,这个类可以包含以下属性:

  • Code:响应的状态码,例如 200 表示成功,400 表示客户端错误,500 表示服务器错误等。
  • Message:响应的消息,例如 "OK" 表示成功,"Bad Request" 表示客户端错误,"Internal Server Error" 表示服务器错误等。
  • Data:响应的数据,可以是任意类型的对象,例如用户信息、产品列表、订单详情等。

这个类的代码如下:

public class ApiResponse
{
    public bool Success { get; set; }
    public string Message { get; set; }
    public object Data { get; set; }

    public ApiResponse(bool success, string message, object data)
    {
        Success = success;
        Message = message;
        Data = data;
    }

    public ApiResponse(bool success, string message)
        : this(success, message, null)
    {
    }

    public ApiResponse(bool success)
        : this(success, null, null)
    {
    }
}

中间件

接下来,我们需要创建一个中间件类来实现自定义规范响应的逻辑,这个类需要有以下特点:

  • 接收一个 RequestDelegate 类型的参数,表示下一个中间件或终端处理程序。
  • 实现一个 InvokeAsync 方法,接收一个 HttpContext 类型的参数,表示当前请求的上下文。
  • InvokeAsync 方法中,使用 await next(context) 来调用下一个中间件或终端处理程序,并获取其返回的响应。
  • InvokeAsync 方法中,根据响应的状态码和内容来构造一个 ApiResponse对象,并将其序列化为 JSON 格式。
  • InvokeAsync 方法中,修改响应的内容类型为 application/json,并将 JSON 格式的 ApiResponse写入到响应体中。
  • GetStatusCodeMessage()根据响应状态给出信息
  • GetResponseData()获取其返回的响应

CustomResponseMiddleware

public class CustomResponseMiddleware
{
    private readonly RequestDelegate _next;

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

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

        using (var responseBody = new MemoryStream())
        {
            context.Response.Body = responseBody;

            await _next(context);

            if (context.Response.StatusCode >= 400 && context.Response.StatusCode <= 599)
            {
                context.Response.ContentType = "application/json";

                var response = new ApiResponse
                {
                    Success = false,
                    Message = GetStatusCodeMessage(context.Response.StatusCode),
                    Data = await GetResponseData(context.Response)
                };

                var jsonResponse = JsonConvert.SerializeObject(response);
                await context.Response.WriteAsync(jsonResponse, Encoding.UTF8);
            }
            else
            {
                context.Response.ContentType = "application/json";

                var response = new ApiResponse
                {
                    Success = true,
                    Message = GetStatusCodeMessage(context.Response.StatusCode),
                    Data = await GetResponseData(context.Response)
                };

                var jsonResponse = JsonConvert.SerializeObject(response);
                await context.Response.WriteAsync(jsonResponse, Encoding.UTF8);
            }

            await responseBody.CopyToAsync(originalBodyStream);
        }
    }
}

GetStatusCodeMessage()

 private static string GetStatusCodeMessage(int statusCode)
    {
        switch (statusCode)
        {
            case 200:
                return "OK";
            case 201:
                return "Created";
            case 204:
                return "No Content";
            case 400:
                return "Bad Request";
            case 401:
                return "Unauthorized";
            case 403:
                return "Forbidden";
            case 404:
                return "Not Found";
            case 500:
                return "Internal Server Error";
            default:
                return "Unknown Status Code";
        }
    }

GetResponseData()

private async Task<object> GetResponseData(HttpResponse response)
    {
        var body = await new StreamReader(response.Body).ReadToEndAsync();
        response.Body.Seek(0, SeekOrigin.Begin);

        try
        {
            return JsonConvert.DeserializeObject(body);
        }
        catch (JsonReaderException)
        {
            return new { Message = body };
        }
    }

在上面的示例中,我们创建了一个名为 CustomResponseMiddleware 的中间件。该中间件拦截每个响应,并根据需要修改响应格式。具体来说,如果响应的状态码为 4xx 或5xx,则中间件将返回一个包含错误消息和数据的 ApiResponse 对象;否则,中间件将返回一个包含成功消息和数据的 ApiResponse 对象。

常用类

定义常用的类可以帮助我们标准化 ASP.NET Core 应用程序中的响应格式,提高代码重用性,并使前端更加轻松地处理所有响应。

除了 ApiResponse 类之外,还可以定义其他常用类,如 ApiError 类、ApiResponse 泛型类等,以满足不同的需求。例如,ApiError 类可以用于标准化应用程序中的错误响应格式,ApiResponse 泛型类可以用于在响应中包含更具体的数据类型。

下面是 ApiError 类的示例代码:

public class ApiError
{
    public int StatusCode { get; set; }
    public string Message { get; set; }

    public override string ToString()
    {
        return JsonConvert.SerializeObject(this);
    }
}

ApiError 类包含两个属性:StatusCodeMessageStatusCode 属性指示错误的状态码,Message 属性包含有关错误的消息。

使用 ApiError 类可以帮助我们标准化应用程序中的错误响应格式。例如,在某些情况下,我们可能需要返回一个包含单个错误消息的响应,而在其他情况下,我们可能需要返回一个包含多个错误消息的响应。通过使用 ApiError 类,我们可以在应用程序中统一处理这些情况,并返回一个标准的错误响应格式。

结论

通过使用 ASP.NET Core 中间件和常用类,我们可以自定义 ASP.NET Core 应用程序中的响应格式,并标准化应用程序中的响应格式。这可以提高代码重用性,并使前端更加轻松地处理所有响应。在开发 ASP.NET Core 应用程序时,我们应该始终考虑使用中间件和常用类来提高代码的可读性、可维护性和可重用性。

原文链接:https://www.cnblogs.com/ke210/p/17298562.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.net core 自定义规范响应的中间件 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • IIS7.5中调试.Net 4.0网站出现无厘头、500错误的解决方法

    在IIS7.5中调试.Net4.0网站时,有时会出现无厘头、500错误的情况。这可能是由于IIS7.5没有正确配置.Net4.0应用程序池而导致的。本文将提供解决方案,帮助解决这个问题。 问题描述 在IIS7.5中调试.Net4.0网站时,有时会出现无厘头、500错误的情况。具体表现为,网站无法正常运行,或者在使用某些功能时崩溃。 解决方案 方法一:配置.N…

    C# 2023年5月15日
    00
  • C#使用semaphore来管理异步下载请求的方法

    下面我将详细讲解“C#使用semaphore来管理异步下载请求的方法”的完整攻略。 什么是 Semaphore Semaphore(信号量)是一种用于控制访问资源的同步方式。它维护了一个计数器(初始值为一个正整数),用来标识可以访问某一资源的线程数量。当一个线程需要访问该资源时,它需要先对这个计数器进行减一操作,当计数器变为0时,该资源将不再被其他线程访问,…

    C# 2023年6月7日
    00
  • C# 基于udp广播收集局域网类所有设备信息

    C# 基于UDP广播收集局域网所有设备信息攻略 简介 UDP广播是一种数据包发送方式,其中数据包被发送到网络上的所有设备而不仅仅是目标设备。这使得它成为一项非常有用的技术,因为它允许我们在局域网内查找所有的设备并进行通信。本攻略将介绍如何使用C#编写基于UDP广播收集局域网所有设备信息的程序。 攻略步骤 步骤一:创建项目 首先,你需要在Visual Stud…

    C# 2023年6月6日
    00
  • MVC使用极验验证制作登录验证码学习笔记7

    下面是“MVC使用极验验证制作登录验证码学习笔记7”的完整攻略。 1. 简介 本文将以MVC模式为基础,介绍如何使用极验验证制作登录验证码。 2. 准备工作 在开始使用极验验证之前,需要先注册一个极验账号,并创建一个验证实例。具体步骤如下: 进入极验验证官方网站,点击“注册”按钮,填写相关信息,完成注册流程; 登录账号后,进入“验证管理”页面,创建一个验证实…

    C# 2023年5月31日
    00
  • C#使用Directoryinfo类获得目录信息和属性的方法

    当我们在C#中需要操作文件系统文件或者目录时,可以利用DirectoryInfo类的一些属性和方法来实现。下面是利用DirectoryInfo类获取目录信息和属性的常用方法: I. 创建DirectoryInfo的实例 我们可以使用DirectoryInfo类的构造函数创建一个DirectoryInfo实例。此时,实例所代表的是当前工作目录的文件夹。 下面的…

    C# 2023年5月31日
    00
  • C# 扩展方法小结

    非常感谢您对C#扩展方法的关注。以下是关于C#扩展方法的完整攻略。 什么是C#扩展方法 C#扩展方法允许程序员向现有类型添加方法,而不必创建新类来继承该类型。扩展方法是一种特殊的静态方法,它在使用时看起来就像在本地类中定义的方法一样。扩展方法可以显式地指定扩展方法所要扩展的类型,也可以扩展任何类型的对象。 C#扩展方法可以让代码变得更加简洁、易读,也可以在某…

    C# 2023年5月15日
    00
  • C# 创建Excel气泡图的实例代码

    下面是详细的讲解。 1.前言 在使用软件的过程中,Excel无疑是一个非常常用的工具。其中,Excel中的图表功能可以让我们在数据分析的时候更加直观。 很多时候,我们需要通过程序生成Excel中的图表。本篇文章,将介绍如何使用C#代码创建Excel中的气泡图。 2.实现思路 气泡图是一种比较常用的图表形式,通过圆形的大小和位置表现数据,非常能够清晰地展示各个…

    C# 2023年6月3日
    00
  • ASP.NET Core设置URLs的五种方法

    ASP.NET Core设置URLs的五种方法 在ASP.NET Core中,可以使用多种方法来设置应用程序的URL。本攻略将介绍五种设置URLs的方法,并提供两个示例说明。 方法一:使用appsettings.json文件 在ASP.NET Core中,可以使用appsettings.json文件来设置应用程序的URL。可以按照以下步骤操作: 在appse…

    C# 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部