C#中创建统一API接口的实现方案

 更新时间:2025年04月04日 08:52:17   作者:老胖闲聊  
在 C# 中创建统一 API 接口需要从架构设计、技术选型和代码实现等多个层面进行规划,本文给大家详细介绍了实现方案和完整示例代码,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

一、技术选型与架构设计

  1. 框架选择

    • ASP.NET Core (6.0+)
    • RESTful API 规范
  2. 核心组件

    • 统一响应格式:标准化 JSON 响应结构
    • 全局异常处理:统一错误返回
    • 版本控制:API 版本管理
    • 认证授权:JWT Bearer 认证
    • 数据验证:Model Validation
    • 日志记录:Serilog 或内置 ILogger
    • Swagger 文档:OpenAPI 规范支持
  3. 架构分层

API Layer (Controllers)
↓
Application Layer (Services)
↓
Domain Layer (Models, Interfaces)
↓
Infrastructure Layer (Repositories)

二、完整实现步骤

1. 创建项目

dotnet new webapi -n UnifiedApiDemo

2. 添加 NuGet 包

dotnet add package Microsoft.AspNetCore.Mvc.Versioning
dotnet add package Swashbuckle.AspNetCore
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

三、核心代码实现

1. 统一响应模型

public class ApiResponse<T>
{
    public int Code { get; set; }
    public string Message { get; set; }
    public T Data { get; set; }
    public DateTime Timestamp { get; } = DateTime.UtcNow;

    public static ApiResponse<T> Success(T data) => new() 
    { 
        Code = 200, 
        Message = "Success", 
        Data = data 
    };
    
    public static ApiResponse<object> Error(int code, string message) => new() 
    { 
        Code = code, 
        Message = message 
    };
}

2. 全局异常处理中间件

public class ExceptionMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<ExceptionMiddleware> _logger;

    public ExceptionMiddleware(RequestDelegate next, ILogger<ExceptionMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Global exception occurred");
            await HandleExceptionAsync(context, ex);
        }
    }

    private static Task HandleExceptionAsync(HttpContext context, Exception exception)
    {
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = exception switch
        {
            ValidationException => StatusCodes.Status400BadRequest,
            UnauthorizedAccessException => StatusCodes.Status401Unauthorized,
            _ => StatusCodes.Status500InternalServerError
        };

        return context.Response.WriteAsJsonAsync(ApiResponse<object>.Error(
            context.Response.StatusCode,
            exception.Message
        ));
    }
}

3. 统一响应包装过滤器

public class ApiResponseFilter : IAsyncResultFilter
{
    public async Task OnResultExecutionAsync(
        ResultExecutingContext context, 
        ResultExecutionDelegate next)
    {
        if (context.Result is ObjectResult objResult)
        {
            var apiResponse = ApiResponse<object>.Success(objResult.Value);
            context.Result = new ObjectResult(apiResponse)
            {
                StatusCode = objResult.StatusCode
            };
        }
        await next();
    }
}

4. 配置服务(Program.cs)

var builder = WebApplication.CreateBuilder(args);

// 添加版本控制
builder.Services.AddApiVersioning(options =>
{
    options.DefaultApiVersion = new ApiVersion(1, 0);
    options.AssumeDefaultVersionWhenUnspecified = true;
    options.ReportApiVersions = true;
});

// 配置 Swagger
builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "Unified API", Version = "v1" });
});

// 添加统一响应过滤器
builder.Services.AddControllers(options =>
{
    options.Filters.Add<ApiResponseFilter>();
});

// 配置 JWT 认证
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options => 
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = "your_issuer",
            ValidateAudience = true,
            ValidAudience = "your_audience",
            ValidateLifetime = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"))
        };
    });

var app = builder.Build();

// 中间件管道
app.UseSwagger();
app.UseSwaggerUI();
app.UseMiddleware<ExceptionMiddleware>();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();

5. 控制器示例(带版本控制)

[ApiController]
[Route("api/v{version:apiVersion}/[controller]")]
[ApiVersion("1.0")]
[Authorize]
public class ProductsController : ControllerBase
{
    [HttpGet("{id}")]
    [ProducesResponseType(typeof(ProductDto), 200)]
    public IActionResult GetProduct(int id)
    {
        var product = new ProductDto { Id = id, Name = "Sample Product" };
        return Ok(product);
    }

    [HttpPost]
    [ValidateModel]
    public IActionResult CreateProduct([FromBody] ProductCreateDto dto)
    {
        // 业务逻辑
        return CreatedAtAction(nameof(GetProduct), new { id = 1 }, null);
    }
}

6. 模型验证示例

public class ProductCreateDto
{
    [Required]
    [StringLength(100)]
    public string Name { get; set; }

    [Range(0, 10000)]
    public decimal Price { get; set; }
}

public class ValidateModelAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            var errors = context.ModelState
                .Where(e => e.Value.Errors.Count > 0)
                .ToDictionary(
                    kvp => kvp.Key,
                    kvp => kvp.Value.Errors.Select(e => e.ErrorMessage).ToArray()
                );
            
            context.Result = new BadRequestObjectResult(
                ApiResponse<object>.Error(400, "Validation Error", errors)
            );
        }
    }
}

四、运行效果示例

成功响应

{
  "code": 200,
  "message": "Success",
  "data": {
    "id": 1,
    "name": "Sample Product"
  },
  "timestamp": "2024-02-20T12:34:56Z"
}

错误响应

{
  "code": 400,
  "message": "Validation Error",
  "data": {
    "Price": ["The field Price must be between 0 and 10000."]
  },
  "timestamp": "2024-02-20T12:35:10Z"
}

五、扩展建议

  1. 性能优化:添加响应缓存机制
  2. 监控:集成 Application Insights
  3. 限流:使用 AspNetCoreRateLimit
  4. DTO 映射:使用 AutoMapper
  5. 单元测试:使用 xUnit/MSTest

此方案提供了从基础设施到业务逻辑的完整统一 API 实现框架,可根据具体需求进行扩展调整。

到此这篇关于C#中创建统一API接口的实现方案的文章就介绍到这了,更多相关C#创建统一API接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C# 实现Ping远程主机功能及代码演示

    C# 实现Ping远程主机功能及代码演示

    这篇文章主要介绍了C# 实现Ping远程主机功能,本教程将演示1.0.2版本更新功能,以及实现的具体代码演示,需要的朋友可以参考下
    2024-05-05
  • c#调用winrar解压缩文件代码分享

    c#调用winrar解压缩文件代码分享

    这篇文章主要介绍了c#调用winrar解压缩文件的方法,大家参考使用吧
    2013-12-12
  • C# 获取当前年份的周期及周期所在日期范围(推荐)

    C# 获取当前年份的周期及周期所在日期范围(推荐)

    这篇文章主要介绍了C# 获取当前年份的周期,周期所在日期范围 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • C#中矩形数组的定义和元素访问

    C#中矩形数组的定义和元素访问

    矩形数组是指由相同数据类型的元素按照行和列组成的二维数组,可以使用索引访问矩形数组中的单个元素,也可以使用循环结构遍历矩形数组中的所有元素,此外,我们还需要注意不要修改矩形数组的维度,避免使用矩形数组造成内存占用过高等问题
    2024-01-01
  • 优雅又实用的C#代码优化技巧分享

    优雅又实用的C#代码优化技巧分享

    这篇文章主要为大家整理了一些优雅又实用的C#代码优化技巧,文中的示例代码讲解详细,对我们深入了解C#有一定的帮助,需要的可以参考一下
    2023-06-06
  • UGUI绘制多点连续的平滑曲线

    UGUI绘制多点连续的平滑曲线

    这篇文章主要为大家详细介绍了UGUI绘制多点连续的平滑曲线,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 原生实现C#与Lua相互调用方法(Unity3D可用)

    原生实现C#与Lua相互调用方法(Unity3D可用)

    Lua是一种很好的扩展性语言,Lua解释器被设计成一个很容易嵌入到宿主程序的库,下面这篇文章主要给大家介绍了关于原生实现C#与Lua相互调用方法,Unity3D可用的相关资料,需要的朋友可以参考下
    2022-04-04
  • C#与js实现去除textbox文本框里面重复记录的方法

    C#与js实现去除textbox文本框里面重复记录的方法

    这篇文章主要介绍了C#与js实现去除textbox文本框里面重复记录的方法,很实用的功能,需要的朋友可以参考下
    2014-08-08
  • C#中this的使用实例分析

    C#中this的使用实例分析

    这篇文章主要介绍了C#中this的使用方法,this是C#程序设计中非常重要的一个关键字,本文以实例形式对此作出简单的用法分析,需要的朋友可以参考下
    2014-08-08
  • 重温C# clr 笔记总结

    重温C# clr 笔记总结

    本篇文章是对以前学习C# clr做的一些笔记,现在拿出来和大家分享下,希望需要的朋友能参考一下
    2013-05-05

最新评论