当前位置: 代码网 > it编程>编程语言>Asp.net > C#中创建统一API接口的实现方案

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

2025年04月04日 Asp.net 我要评论
一、技术选型与架构设计框架选择asp.net core (6.0+)restful api 规范核心组件统一响应格式:标准化 json 响应结构全局异常处理:统一错误返回版本控制: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接口内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com