You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.NET Core WebAPI中集成并托管Swagger Codegen

嘿,我刚好折腾过类似的需求,咱们一步步来搞定在.NET Core WebAPI里托管Swagger Codegen的事儿,不用纠结文档不足的问题,我把实操步骤给你理得明明白白:

一、先明确:是否需要额外工具?

不需要单独下载独立的Swagger Codegen CLI(当然本地测试可以用,但托管到WebAPI里用NuGet包更省心)。核心是通过.NET生态的包来封装Swagger Codegen的能力,或者用更贴合.NET的替代方案NSwag(后面会讲)。

二、方案1:用SwaggerCodegenNet直接托管Swagger Codegen

这是社区封装的.NET版Swagger Codegen,不用依赖Java环境,直接集成到WebAPI里。

步骤1:安装必要NuGet包

打开.NET CLI或者Package Manager Console,执行:

dotnet add package SwaggerCodegenNet
# 如果你还没装Swashbuckle,补上这个
dotnet add package Swashbuckle.AspNetCore.Swagger

步骤2:创建Codegen接口控制器

新建一个CodegenController,写一个POST接口接收Swagger JSON/RAML,生成.NET Core客户端代码并返回ZIP包:

using Microsoft.AspNetCore.Mvc;
using SwaggerCodegenNet;
using System.IO.Compression;

[ApiController]
[Route("api/[controller]")]
public class CodegenController : ControllerBase
{
    // 接收Swagger JSON生成客户端
    [HttpPost("generate-dotnet-client")]
    public IActionResult GenerateDotnetClient([FromBody] string swaggerJson)
    {
        try
        {
            // 配置生成选项
            var codegenOptions = new CodegenOptions
            {
                GeneratorName = "csharp-netcore", // 指定.NET Core客户端生成器
                OutputFolder = Path.Combine(Path.GetTempPath(), "SwaggerCodegenTemp"),
                AdditionalProperties = new Dictionary<string, string>
                {
                    {"packageName", "MyCustomApiClient"},
                    {"packageVersion", "1.0.0"},
                    {"targetFramework", "net6.0"} // 按你的项目框架调整
                }
            };

            // 执行代码生成
            var codegen = new SwaggerCodegen();
            codegen.GenerateFromJsonString(swaggerJson, codegenOptions);

            // 打包成ZIP返回
            var zipPath = Path.Combine(Path.GetTempPath(), "MyApiClient.zip");
            ZipFile.CreateFromDirectory(codegenOptions.OutputFolder, zipPath);

            var zipBytes = System.IO.File.ReadAllBytes(zipPath);
            return File(zipBytes, "application/zip", "MyApiClient.zip");
        }
        catch (Exception ex)
        {
            return BadRequest($"生成失败:{ex.Message}");
        }
        finally
        {
            // 清理临时文件
            var tempFolder = Path.Combine(Path.GetTempPath(), "SwaggerCodegenTemp");
            if (Directory.Exists(tempFolder)) Directory.Delete(tempFolder, true);
            var zipPath = Path.Combine(Path.GetTempPath(), "MyApiClient.zip");
            if (System.IO.File.Exists(zipPath)) System.IO.File.Delete(zipPath);
        }
    }

    // 支持RAML格式:先转成Swagger JSON再生成
    [HttpPost("generate-dotnet-client-from-raml")]
    public IActionResult GenerateFromRaml([FromBody] string ramlContent)
    {
        try
        {
            // 用Raml.Net把RAML转成Swagger JSON
            var ramlParser = new Raml.Net.RamlParser();
            var ramlApi = ramlParser.Parse(ramlContent);
            var swaggerJson = ramlApi.ToSwaggerJson();

            // 复用上面的生成逻辑
            return GenerateDotnetClient(swaggerJson);
        }
        catch (Exception ex)
        {
            return BadRequest($"RAML转换或生成失败:{ex.Message}");
        }
    }
}

注意:要支持RAML的话,还得额外装Raml.Net包:

dotnet add package Raml.Net
三、方案2:用NSwag(更贴合.NET生态的替代方案)

如果担心SwaggerCodegenNet的维护性,NSwag是.NET原生的工具链,对.NET特性(比如Nullable、Async/Await)支持更好,完全不需要依赖Java。

步骤1:安装NSwag包

dotnet add package NSwag.AspNetCore

步骤2:创建NSwag Codegen接口

using Microsoft.AspNetCore.Mvc;
using NJsonSchema.CodeGeneration.CSharp;
using NSwag;

[ApiController]
[Route("api/[controller]")]
public class NSwagCodegenController : ControllerBase
{
    [HttpPost("generate-dotnet-client")]
    public async Task<IActionResult> GenerateDotnetClient([FromBody] string swaggerJson)
    {
        try
        {
            // 加载Swagger文档
            var swaggerDoc = await OpenApiDocument.FromJsonAsync(swaggerJson);

            // 配置C#客户端生成选项
            var generatorSettings = new CSharpClientGeneratorSettings
            {
                ClassName = "MyNSwagApiClient",
                Namespace = "MyApi.Client.NSwag",
                TargetFramework = CSharpTargetFramework.Net60,
                GenerateClientInterfaces = true,
                GenerateExceptionClasses = true,
                GenerateNullableReferenceTypes = true // 支持.NET 6+的可空引用类型
            };

            // 生成代码
            var generator = new CSharpClientGenerator(swaggerDoc, generatorSettings);
            var clientCode = generator.GenerateFile();

            // 返回代码文件(也可以打包成ZIP)
            var codeBytes = System.Text.Encoding.UTF8.GetBytes(clientCode);
            return File(codeBytes, "text/plain", "MyNSwagApiClient.cs");
        }
        catch (Exception ex)
        {
            return BadRequest($"生成失败:{ex.Message}");
        }
    }
}
四、测试你的Codegen接口

启动WebAPI后,用Postman或者Swagger UI调用对应的接口:

  • 调用/api/codegen/generate-dotnet-client,传入你的Swagger JSON(可以从/swagger/v1/swagger.json获取),就能拿到生成的客户端代码ZIP包
  • 如果是RAML,调用/api/codegen/generate-dotnet-client-from-raml传入RAML内容即可

内容的提问来源于stack exchange,提问作者arpymastro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:42:29