.net-core - 在 Swagger 中为 .NET Core 3.1 使用自定义索引
问题描述
通过网络搜索,我发现我可以在招摇中替换 index.html 文件。我遵循大多数人所说的,我可以用自定义文件替换索引文件。只需在项目中的某个位置放置一个 index.html,将其标记为嵌入资源并在 Startup 类的 Configure 函数中添加几行。
我的自定义索引放置在名为 Swagger 的文件夹下,并且加载良好。但是一旦我重新加载页面,我就会得到一个异常:“ArgumentException:Stream is not readable。”。
我的配置选项如下所示:
string path = GetType().Namespace + ".Swagger.index.html";
var resource = GetType().Assembly.GetManifestResourceStream(path);
app.UseSwagger(config => { config.RouteTemplate = $"{doc_path}/{{documentName}}/{doc_file}"; });
app.UseSwaggerUI(config =>
{
config.RoutePrefix = doc_path;
config.SwaggerEndpoint($"{doc_vers}/{doc_file}", "Rest API Doc");
config.InjectStylesheet($"style.css");
config.IndexStream = () => resource);
});
我还尝试将 index.html 放在 wwwroot 文件夹下,它再次加载,但情况变得更糟。网站仅在 javascript 控制台上显示 %(HeadContent)、%(DocumentTitle) 的标题和一些错误。
解决方案
问题是从 IndexStream 的 lambda 表达式创建资源路径字符串。这完全是关于 .net 核心如何处理不同的 api 调用以及它如何为每个调用构造对象。
我必须替换这些行:
string path = GetType().Namespace + ".Swagger.index.html";
var resource = GetType().Assembly.GetManifestResourceStream(path);
app.UseSwaggerUI(config =>
{
-- some code here
config.IndexStream = () => resource);
});
这样:
app.UseSwaggerUI(config =>
{
-- some code here
config.IndexStream = () => GetType().Assembly.GetManifestResourceStream
(
GetType().Namespace + ".Swagger.index.html")
);
});
关于将 index.html 放在 wwwroot 文件夹下,swagger 似乎为文件替换了一些文本,如果使用 IndexStream 函数引用索引文件则无法做到这一点。