Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >你知道吗?从 .NET9 开始删除内置的 Swagger 支持 (Swashbuckle)!

你知道吗?从 .NET9 开始删除内置的 Swagger 支持 (Swashbuckle)!

作者头像
郑子铭
发布于 2024-11-23 05:35:44
发布于 2024-11-23 05:35:44
38300
代码可运行
举报
运行总次数:0
代码可运行

.NET 9 中使用 Scalar 替代内置的 Swagger 支持 (Swashbuckle

Microsoft 已决定从 .NET 9 中删除内置的 Swagger 支持 (Swashbuckle)。

为什么 Swagger (Swashbuckle) 被删除?

ASP.NET Core 团队已决定从 .NET 9 中删除内置的 Swagger 支持 (Swashbuckle),原因如下:

  1. 维护问题:Swashbuckle 项目不再由其社区所有者积极维护。问题未得到解决或解决,并且 .NET 8 没有正式版本。
  2. ASP.NET Core 的演变:自从在 .NET 5 中引入 Swagger 支持以来,ASP.NET Core 已经有了显著的发展。它现在内置了对描述 Web API 所需的元数据的支持,从而减少了对外部工具的需求。
  3. 专注于 OpenAPI:该团队希望使 OpenAPI 成为 ASP.NET Core 中的一等公民。他们计划扩展 OpenAPI 文档生成功能,而不依赖外部包。Microsoft.AspNetCore.OpenApi
  4. 替代工具:Visual Studio 现在提供对 .http 文件的内置支持和新的 Endpoints Explorer,从而提供探索、测试和调试 API 的替代方法。
  5. 社区驱动的创新:通过消除默认依赖项,团队鼓励使用和开发可能更适合特定项目需求的各种 OpenAPI 工具。

Swagger 的替代方案:Scalar.AspNetCore

Scalar 是来自 OpenAPI/Swagger 文档的交互式 API 文档。

这个 .NETScalar.AspNetCore 提供了一种基于 OpenAPI/Swagger 文档呈现漂亮的 API引用的简单方法。

Scalar.AspNetCore

您可以在此处获取更多信息。

  • https://github.com/scalar/scalar
  • https://www.nuget.org/packages/Scalar.AspNetCore

如何在 Dotnet 9 中使用它?

1、安装 nuget 包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dotnet add package Scalar.AspNetCore

2、示例用法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using Scalar.AspNetCore;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddOpenApi();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.MapScalarApiReference(); // scalar/v1
    app.MapOpenApi();
}

app.MapGet("/", () => "Hello world!");

app.Run();

运行应用程序时,您可以在终端节点访问 API 文档。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://localhost:port/scalar/v1

如何将 Bearer 身份验证方案添加到 Scalar ?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.OpenApi;
using Microsoft.OpenApi.Models;

namespace WebApplication1.Transformers;

public sealed class BearerSecuritySchemeTransformer(IAuthenticationSchemeProvider authenticationSchemeProvider) : IOpenApiDocumentTransformer
{
    private readonly string _authenticationSchemeName = "Bearer";

    public async Task TransformAsync(OpenApiDocument document, OpenApiDocumentTransformerContext context, CancellationToken cancellationToken)
    {
        var authenticationSchemes = await authenticationSchemeProvider.GetAllSchemesAsync();
        if (authenticationSchemes.Any(authScheme => authScheme.Name == _authenticationSchemeName))
        {
            // Add the security scheme at the document level
            var requirements = new Dictionary<string, OpenApiSecurityScheme>
            {
                [_authenticationSchemeName] = new OpenApiSecurityScheme
                {
                    Type = SecuritySchemeType.Http,
                    Scheme = _authenticationSchemeName.ToLower(), // "bearer" refers to the header name here
                    In = ParameterLocation.Header,
                    BearerFormat = "Json Web Token"
                }
            };
            document.Components ??= new OpenApiComponents();
            document.Components.SecuritySchemes = requirements;

            // Apply it as a requirement for all operations
            foreach (var operation in document.Paths.Values.SelectMany(path => path.Operations))
            {
                operation.Value.Security.Add(new OpenApiSecurityRequirement
                {
                    [new OpenApiSecurityScheme
                    {
                        Reference = new OpenApiReference
                        {
                            Id = _authenticationSchemeName,
                            Type = ReferenceType.SecurityScheme
                        }
                    }] = Array.Empty<string>()
                });
            }
        }
    }
}
  • 用法示例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
builder.Services.AddOpenApi(opt =>
{
    opt.AddDocumentTransformer<BearerSecuritySchemeTransformer>();
});

使用 Scalar 的式例

创建 webapi 项目

此处我们使用 .NET CLI 创建 ASP.NET Core Web API 项目,操作步骤如下:

1、确保已安装 .NET SDK

  • 可以通过运行 dotnet --version 命令来检查是否已安装 .NET9 SDK
  • 如果未安装,可以从 .NET 官方网站 下载并安装。

.NET 官方网站 :

  • https://dotnet.microsoft.com/zh-cn/download
  • https://dotnet.microsoft.com/en-us/download

2、创建项目目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir MyWebApi

3、创建 ASP.NET Core Web API 项目:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dotnet new webapi -n MyWebApi

4、导航到项目目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd MyWebApi

5、运行项目:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dotnet run

通过上面操作,此时我们就准备好 asp.net core webapi 项目,名称为:MyWebApi

安装 nuget 包

使用 .net cli 安装 nuget 包文件,执行如下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dotnet add package Microsoft.AspNetCore.OpenApi --version 9.0.0-rc.2.24474.3
dotnet add package Scalar.AspNetCore --version 1.2.23

添加文件夹目录

在项目中添加文件夹目录,命名为:Transformers,并在该目录中添加 BearerSecuritySchemeTransformer.cs 文件,该文件的作用是将 Bearer 身份验证方案添加到 Scalar 中,代码演示如签名环节说明。

修改 Program.cs 文件

此处使用 MiniAPI 模式,在 Program.cs 文件中代码改造如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System.Text.Json.Serialization;
using Scalar.AspNetCore;
using WebApplication1.Transformers;

var builder = WebApplication.CreateSlimBuilder(args);

// 配置 HTTP JSON 选项,用于自定义 JSON 序列化行为。
builder.Services.ConfigureHttpJsonOptions(options =>
{
    // 在类型解析链中插入自定义的 JSON 序列化上下文。
    options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
});

// 启用 OpenAPI 文档支持,并配置 OpenAPI 文档。
//builder.Services.AddOpenApi();
builder.Services.AddOpenApi(opt =>
{
    // 添加一个文档转换器,用于处理特定的安全方案(例如: Bearer Token)。
    opt.AddDocumentTransformer<BearerSecuritySchemeTransformer>();
});

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    // 映射 OpenAPI 文档路由。
    app.MapOpenApi();
    //app.MapScalarApiReference(); // scalar/v1

    // 映射自定义的 API 文档路由,并使用 Fluent API 进行配置,例如:设置标题、主题、侧边栏等。
    app.MapScalarApiReference(options =>
    {
        options
            .WithTitle("My custom API")
            .WithTheme(ScalarTheme.Mars)
            .WithSidebar(true)
            .WithDefaultHttpClient(ScalarTarget.CSharp, ScalarClient.HttpClient)
            .WithPreferredScheme("ApiKey")
            .WithApiKeyAuthentication(x => x.Token = "my-api-key");
    });
}

// 定义示例数据,一个包含示例待办事项的数组
var sampleTodos = new Todo[] {
    new(1, "Walk the dog"),
    new(2, "Do the dishes", DateOnly.FromDateTime(DateTime.Now)),
    new(3, "Do the laundry", DateOnly.FromDateTime(DateTime.Now.AddDays(1))),
    new(4, "Clean the bathroom"),
    new(5, "Clean the car", DateOnly.FromDateTime(DateTime.Now.AddDays(2)))
};

// 定义 API 路由
var todosApi = app.MapGroup("/todos"); // 创建一个路由组,前缀为 /todos。
todosApi.MapGet("/", () => sampleTodos); // 映射 GET 请求到根路径,返回所有待办事项。
// 映射 GET 请求到特定 ID 的路径,返回对应的待办事项,如果找不到则返回 404 Not Found。
todosApi.MapGet("/{id}", (int id) =>
    sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
        ? Results.Ok(todo)
        : Results.NotFound());

app.Run();

// 定义一个记录类 Todo,包含 Id、Title、DueBy 和 IsComplete 属性。
public record Todo(int Id, string? Title, DateOnly? DueBy = null, bool IsComplete = false);

// 自定义的 JSON 序列化上下文
[JsonSerializable(typeof(Todo[]))] // 标记 AppJsonSerializerContext 类,使其支持 Todo 数组的 JSON 序列化。
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
   // 定义一个部分类 AppJsonSerializerContext,继承自 JsonSerializerContext,用于自定义 JSON 序列化行为。
}

运行项目,浏览器输入地址:

  • 查看 todos 接口数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://localhost:5264/todos

todos

  • 查看 scalar 页面:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://localhost:5264/scalar/v1

scalar/v1

  • /todos

/todos

点击 【test request】显示如下:

test request

点击【send】显示如下:

send

Scalar 的配置扩展

Scalar.AspNetCore 包中,IEndpointRouteBuilder 该方法有一个可选参数,可用于自定义 Scalar UI 的行为:MapScalarApiReference

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#region 程序集 Scalar.AspNetCore, Version=1.2.23.0, Culture=neutral, PublicKeyToken=null
// C:\Users\Jeffrey\.nuget\packages\scalar.aspnetcore\1.2.23\lib\net9.0\Scalar.AspNetCore.dll
// Decompiled with ICSharpCode.Decompiler 8.1.1.7464
#endregion

using System;
using System.Text.Json;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Generated;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Options;

namespace Scalar.AspNetCore;

//
// 摘要:
//     Extension methods for Microsoft.AspNetCore.Routing.IEndpointRouteBuilder to provide
//     required endpoints.
public static class ScalarEndpointRouteBuilderExtensions
{
    private const string DocumentName = "{documentName}";

    private const string StaticAssets = "ScalarStaticAssets";

    internal const string ScalarJavaScriptFile = "scalar.js";

    //
    // 摘要:
    //     Maps the Scalar API reference endpoint.
    //
    // 参数:
    //   endpoints:
    //     Microsoft.AspNetCore.Routing.IEndpointRouteBuilder.
    public static IEndpointConventionBuilder MapScalarApiReference(this IEndpointRouteBuilder endpoints)
    {
        return endpoints.MapScalarApiReference(delegate
        {
        });
    }

    //
    // 摘要:
    //     Maps the Scalar API reference endpoint.
    //
    // 参数:
    //   endpoints:
    //     Microsoft.AspNetCore.Routing.IEndpointRouteBuilder.
    //
    //   configureOptions:
    //     An action to configure the Scalar options.
    public static IEndpointConventionBuilder MapScalarApiReference(this IEndpointRouteBuilder endpoints, Action<ScalarOptions> configureOptions)
    {
        ScalarOptions options = endpoints.ServiceProvider.GetService<IOptions<ScalarOptions>>()?.Value ?? new ScalarOptions();
        configureOptions(options);
        if (!options.EndpointPathPrefix.Contains("{documentName}"))
        {
            throw new ArgumentException("'EndpointPathPrefix' must define '{documentName}'.");
        }

        bool useLocalAssets = string.IsNullOrEmpty(options.CdnUrl);
        string standaloneResourceUrl = (useLocalAssets ? options.EndpointPathPrefix.Replace("{documentName}", "scalar.js") : options.CdnUrl);
        EmbeddedFileProvider fileProvider = new EmbeddedFileProvider(typeof(ScalarEndpointRouteBuilderExtensions).Assembly, "ScalarStaticAssets");
        FileExtensionContentTypeProvider fileExtensionContentTypeProvider = new FileExtensionContentTypeProvider();
        string configuration = JsonSerializer.Serialize(options.ToScalarConfiguration(), ScalaConfigurationSerializerContext.Default.ScalarConfiguration);
        return endpoints.MapGet0(options.EndpointPathPrefix, (Func<string, IResult>)delegate (string documentName)
        {
            if (useLocalAssets)
            {
                IFileInfo fileInfo = fileProvider.GetFileInfo(documentName);
                if (fileInfo.Exists)
                {
                    string contentType;
                    string contentType2 = (fileExtensionContentTypeProvider.TryGetContentType(documentName, out contentType) ? contentType : "application/octet-stream");
                    return Results.Stream(fileInfo.CreateReadStream(), contentType2, null, fileInfo.LastModified);
                }
            }

            string value = options.Title.Replace("{documentName}", documentName);
            string value2 = options.OpenApiRoutePattern.Replace("{documentName}", documentName);
            return Results.Content($"<!doctype html>\n<html>\n<head>\n    <title>{value}</title>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n</head>\n<body>\n    <script id=\"api-reference\" data-url=\"{value2}\"></script>\n    <script>\n    document.getElementById('api-reference').dataset.configuration = JSON.stringify({configuration})\n    </script>\n    <script src=\"{standaloneResourceUrl}\"></script>\n</body>\n</html>", "text/html");
        }).ExcludeFromDescription();
    }
}

MapScalarApiReference 方法,除了上面的式例中使用的 Fluent API 模式,还可以使用 Object initializer 方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Object initializer
app.MapScalarApiReference(options =>
{
    options.Title = "My custom API";
    options.Theme = ScalarTheme.Mars;
    options.ShowSidebar = false;
    options.DefaultHttpClient = new(ScalarTarget.CSharp, ScalarClient.HttpClient);
    options.Authentication = new ScalarAuthenticationOptions
    {
        PreferredSecurityScheme = "ApiKey",
        ApiKey = new ApiKeyOptions
        {
            Token = "my-api-key"
        }
    };
});

有关更多可能的选项及其默认值,请查看 ScalarOptions.cs 类。

  • ScalarOptions.cs 类,https://github.com/scalar/scalar/blob/main/packages/scalar.aspnetcore/src/Scalar.AspNetCore/Options/ScalarOptions.cs

也可以使用 options 模式通过依赖注入来配置选项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
builder.Services.Configure<ScalarOptions>(options => options.Title = "My custom API");
// or
builder.Services.AddOptions<ScalarOptions>().BindConfiguration("Scalar");

注意:通过该方法设置的选项将优先于通过依赖关系注入设置的选项。MapScalarApiReference

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何把ASP.NET Core WebApi打造成Mcp Server
MCP (Model Context Protocol)即模型上下文协议目前不要太火爆了,关于它是什么相信大家已经很熟悉了。目前主流的AI开发框架和AI工具都支持集成MCP,这也正是它的意义所在。毕竟作为一个标准的协议,当然是更多的生态接入进来才会有意义。使用MCP我们可以把Tools调用标准化,这意味着我们可以忽略语言、框架快速把工具融合到不同的模型中去。现在,如何把现有的业务逻辑快速的接入到模型中,成为模型落地很关键的一步,今天我们就借助微软的Semantic Kernel和Microsoft.Extensions.AI框架,通过简单的示例展示,如何把现有的ASP NET Core WebApi转换成MCP Server。
郑子铭
2025/06/11
1270
如何把ASP.NET Core WebApi打造成Mcp Server
在 .NET 9 中使用 Scalar 替代 Swagger
在.NET 9发布以后ASP.NET Core官方团队发布公告已经将Swashbuckle.AspNetCore(一个为ASP.NET Core API提供Swagger工具的项目)从ASP.NET Core Web API模板中移除,这意味着以后我们创建Web API项目的时候不会再自动生成Swagger API文档了。那么今天咱们一起来试试把我们的EasySQLite .NET 9的项目使用Scalar用于交互式API文档。
追逐时光者
2025/01/10
2630
在 .NET 9 中使用 Scalar 替代 Swagger
体验 dotnet 9 中的 OpenAPI 支持
首先我们需要添加对 Microsoft.AspNetCore.OpenApi 的 NuGet 包引用,然后就可以开始改造代码了
郑子铭
2024/12/23
2870
体验 dotnet 9 中的 OpenAPI 支持
.NET7 Preview4 之OpenAPI swagger改进
在MiniAPI系列中,《.NET6之MiniAPI(十八):OpenAPI swagger》介绍了swagger在MiniAPI框架中的使用,当时留下很多不足,随着.NET7 Preview4的推出,这方面得到了很大的改进,我还是使用“十八”这篇文章的案例。 如果想参看原来文章,见下面引用: 此次对OpenAPI的提升主要是通过命名空间Microsoft.AspNetCore.OpenApi带来的。
张哥编程
2024/12/13
820
.NET7 Preview4 之OpenAPI swagger改进
用最清爽的方式开发.NET
不管是官方自带模板还是其他开源搞的,总是一来一大堆,如果你也嫌弃这些过于臃肿,不如看看我这个方式
郑子铭
2024/01/03
2820
用最清爽的方式开发.NET
基于ASP.NET Core 3.x的端点路由(Endpoint Routing)实现控制器(Controller)和操作(Action)分离的接口服务
本文首发于 码友网 -- 《基于ASP.NET Core 3.x的端点路由(Endpoint Routing)实现控制器(Controller)和操作(Action)分离的接口服务》
Rector
2020/10/10
1.6K0
基于ASP.NET Core 3.x的端点路由(Endpoint Routing)实现控制器(Controller)和操作(Action)分离的接口服务
ASP.NET Core 中的 JWT 鉴权实现
在当今的软件开发中,安全性和用户认证是至关重要的方面。JSON Web Token(JWT)作为一种流行的身份验证机制,因其简洁性和无状态特性而被广泛应用于各种应用中,尤其是在 ASP.NET Core 项目里。本文将详细介绍如何在 ASP.NET Core 应用中实现 JWT 鉴权,确保应用能够安全地验证用户身份并授权访问特定资源。
郑子铭
2025/03/10
4590
ASP.NET Core 中的 JWT 鉴权实现
asp.net core 3.1/swagger
安装nuget包:Swashbuckle.AspNetCore.SwaggerUI和Swashbuckle.AspNetCore.Annotations,配置swagger:
雪飞鸿
2020/05/25
5900
了解 .NET 9 中的新增的包 Microsoft.AspNetCore.OpenApi
.NET9 剔除内置的 Swagger/Swashbuckle 组件,新增 Microsoft.AspNetCore.OpenApi 包。
郑子铭
2024/11/23
4350
了解 .NET 9 中的新增的包 Microsoft.AspNetCore.OpenApi
从 MVC 到使用 ASP.NET Core 6.0 的Minimal API
https://benfoster.io/blog/mvc-to-minimal-apis-aspnet-6/
郑子铭
2021/11/10
8.1K0
【愚公系列】2023年02月 .NET/C#知识点-.NET Core配置文件详解
任何一个系统进程都是同个IP和端口号的组合来定位的。网站其实也是进程之一,网站的访问,都是通过服务器的IP和端口号的组合来实现访问的,比如:127.0.0.1:8080,浏览器访问就是:
愚公搬代码
2023/03/16
9240
【愚公系列】2023年02月 .NET/C#知识点-.NET Core配置文件详解
.NET Core 3.0 使用Nswag生成Api文档和客户端代码
在前后端分离、Restful API盛行的年代,完美的接口文档,成了交流的纽带。在项目中引入Swagger (也称为OpenAPI),是种不错的选择,它可以让接口数据可视化。下文将会演示
李明成
2020/02/12
4.9K0
从壹开始学习NetCore 44 ║ 最全的 netcore 3.0 升级实战方案
缘起 1、哈喽大家中秋节(后)好呀!感觉已经好久没有写文章了,但是也没有偷懒哟,我的视频教程《系列一、NetCore 视频教程(Blog.Core)》也已经录制八期了,还在每周末同步更新中,欢迎大家多多指教。 2、除此之外呢,我也在平时的时间帮朋友开发了一个小项目,就是使用 .net mvc+vue+ele+mongo 框架写的项目,之前一直想着用mvc结合着vue写,这次也终于上手了,不过是一个小的demo,因为是朋友的项目,所以就不开源了。 言归正传,👉 从2018年8月就开始听说 netcore 要
老张的哲学
2022/04/10
9460
从壹开始学习NetCore 44 ║ 最全的 netcore 3.0 升级实战方案
ChatGPT Plugin插件开发:基于 ASP.NET Core Minimal API
这是一篇ChatGPT插件开发教程,描述如何使用 ASP.NET Core Minimal API 开发 ChatGPT 插件,以最简单的 Todo List 指导示例作为入门教程。
郑子铭
2023/08/29
4270
ChatGPT Plugin插件开发:基于 ASP.NET Core Minimal API
ASP.NET Core JWT+Cookie双重认证实战指南,Swagger集成与Axios全流程解析
许多.NET开发者在使用ASP.NET Core Identity实现基础认证时常常陷入困境。本文将提供一份纯实战指南,演示如何实现支持[Authorize]特性的JWT令牌+Cookie双重认证方案。这种方案特别适合需要同时满足API认证和Swagger登录的场景,并附赠SPA应用中使用Axios进行Cookie认证的完整示例。
郑子铭
2025/05/14
1820
ASP.NET Core JWT+Cookie双重认证实战指南,Swagger集成与Axios全流程解析
.NET WebAPI 实现 接口版本控制并打通 Swagger支持
我们在开发 webapi 项目时如果遇到 api 接口需要同时支持多个版本的时候,比如接口修改了入参之后但是又希望支持老版本的前端(这里的前端可能是网页,可能是app,小程序 等等)进行调用,这种情况常见于 app,毕竟网页前端我们可以主动控制发布,只要统一发布后所有人的浏览器下一次访问网页时都会重新加载到最新版的代码,但是像 app 则无法保证用户一定会第一时间升级更新最新版的app,所以往往需要 api接口能够同时保持多个版本的逻辑,同支持新老版本的调用端app进行调用。
乌拉栋
2022/10/28
1.3K0
.NET WebAPI 实现 接口版本控制并打通 Swagger支持
asp.net core使用Swashbuckle.AspNetCore(swagger)生成接口文档
开局一张图,然后开始编,一些基本的asp.net core东西就不再赘述,本文只对Swashbuckle.AspNetCore的几个使用要点进行描述。
易墨
2018/09/14
2.2K0
asp.net core使用Swashbuckle.AspNetCore(swagger)生成接口文档
(转载非原创)由ASP.NET Core WebApi添加Swagger报错引发的探究
在使用ASP.NET Core进行WebApi项目开发的时候,相信很多人都会使用Swagger作为接口文档呈现工具。相信大家也用过或者了解过Swagger,这里咱们就不过多的介绍了。本篇文章记录一下,笔者在使用ASP.NET Core开发Api的过程中,给接口整合Swagger过程中遇到的一个异常,笔者抱着好奇的心态研究了一下异常的原因,并解决了这个问题。在这个过程中笔者学到了一些新的技能,得到了一些新的知识,便打算记录一下,希望能帮助到更多的人。
xlj
2021/07/10
2.1K0
快速展示原型之Minimal API开发
Minimal API官网地址: https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/minimal-apis/security?view=aspnetcore-7.0
明志德道
2023/10/21
6050
ASP.NET Core | 笔记
将 [EnableCors] 属性与命名策略一起使用在限制支持 CORS 的终结点方面提供了最佳控制。 警告 UseCors 必须按正确的顺序调用 。 有关详细信息,请参阅 中间件顺序。 例如, UseCors 在使用 之前必须 UseResponseCaching 调用 UseResponseCaching 。
yiyun
2022/04/01
4.9K0
ASP.NET Core | 笔记
推荐阅读
相关推荐
如何把ASP.NET Core WebApi打造成Mcp Server
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验