ASP.NET Core 在启动时解析 url?

Posted

技术标签:

【中文标题】ASP.NET Core 在启动时解析 url?【英文标题】:ASP.NET Core resolve url in startup? 【发布时间】:2017-06-28 13:17:57 【问题描述】:

我希望能够注册某些考虑到资源实际 URL 的 URL。具体来说:我的 Web API 文档的 Swagger 端点。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

    app.UseMvc();

     app.UseSwagger();
     app.UseSwaggerUi(c =>
     
         c.SwaggerEndpoint($"/swagger/v1/swagger.json", "API documentation");
         //c.SwaggerEndpoint($"/TheGreatestWebAPI/swagger/v1/swagger.json", "API documentation");
     );

在我的开发环境中,我将在 http://localhost:5000 上托管 Web PI,在这种情况下,Swagger 想在这里与其端点对话:

http://localhost:5000/swagger/v1/swagger.json

在生产或暂存环境中,Web API 将作为 Web 应用程序托管在 IIS 中,地址类似于 https://test.contoso.com/TheGreatestWebAPI,并且 swagger 会想与此对话:

https://test.contoso.com/TheGreatestWebAPI/swagger/v1/swagger.json

...因此后者被注释掉的端点注册。

我想做的是使用这样的东西:

c.SwaggerEndpoint($"~/swagger/v1/swagger.json", "API documentation");

使用过 ASP.NET Web 表单Page.ResolveUrl() 的任何人都应该熟悉这一点,据我所知,同样的功能应该可以通过UrlHelper.Content() 获得。但是函数需要UrlHelper类的实例,而相关的构造函数需要ActionContext实例。

我不知道在这种情况下如何正确实例化UrlHelperStartup.Configure() 中的UseSwaggerUI())。

-S

【问题讨论】:

【参考方案1】:

该方法的文档说路径可以是完全限定的或相对于页面。

就我而言,只需删除路径的第一部分就足够了:

c.SwaggerEndpoint("v1/swagger.json", "API documentation");

【讨论】:

那行得通,有点。删除前导的“/swagger”和“/TheGreatestAPI/swagger”实际上确实导致定义端点分别位于https://localhost:5000/swagger/v1/swagger.jsonhttps://test.contoso.com/TheGreatestWebAPI/swagger/v1/swagger.json。但是,https://localhost:5000/swagger/index.html 的标准 Swagger GUI 页面尝试从 https://localhost:5001/swagger/index.html/v1/swagger.json 加载 - 它实质上使用相对 url 而不是 文件夹跨度> @SigurdGarshol 我明白了。我通常只去/swagger,而不直接去/swagger/index.html,但如果它有时不起作用,那肯定不是理想的。您也可以只为站点的根目录添加一个配置值,然后在配置 swagger 时将其传入。 可能只是我们现在使用的swagger版本,但是/swagger会自动重定向到/swagger/index.html。因此,我们没有解决方法。 :(

以上是关于ASP.NET Core 在启动时解析 url?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net core 系列 5 MVC框架路由(上)

Asp.Net Core 2.1 Identity - UserStore 依赖注入

ASP.NET Core 1.0 基础与应用启动

Asp.Net Core API 禁用启动完成消息

ASP.NET Core Web API:尝试激活时无法解析服务类型

如何正确解析要在 ASP.NET Core 3.1 的 ConfigureServices() 中使用的服务?