0

我们正在使用 Asp.Net Core 创建一个带有 Swagger 的 REST 服务。我们将服务托管在这样的 URL 上:

https://www.mywebsite.com/myservice

使用以下代码:

    applicationBuilder
        .UseSwagger()
        .UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("../swagger/1.0.0/swagger.json"",title);
            c.DisplayRequestDuration();
            c.OAuthClientId(clientId);
            c.OAuthRealm(redirectUri);
            c.OAuthAppName("App");
        });

... Swagger-UI 在以下位置正确加载:

https://www.mywebsite.com/myservice/swagger/

但是当我尝试使用 Execute-Button 通过 UI 发出请求时,我得到了 404,因为 UI 尝试在 URL 中没有 /myservice/ 的情况下执行请求:

https://www.mywebsite.com/v1/cars

代替

https://www.mywebsite.com/myservice/v1/cars

如何正确配置服务,以便 Swagger UI 调用也能正常工作?

暗示:

这应该以通用的方式完成(如 UI 的 ../),因为我们会将服务部署在不同的环境中,因此 www.mywebsite.com 在每个环境中都不相同。

谢谢你的帮助!

问候,

彼得

4

1 回答 1

0

两者都Swagger需要Swagger UI配置相对路径。例如,如果我希望 UI 可以在应用程序的根目录(无论可能是什么)和 JSON 端点访问swagger/{documentName}/swagger.json,我的配置将如下所示:

// register the services
services.AddSwaggerGen(c => {    
  c.SwaggerDoc("latest", new Info { Title = "Web API", Version = "latest" }); 
}

...

app.UseMvc();

// Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger(c => {
    c.RouteTemplate = "swagger/{documentName}/swagger.json";
}

// Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.), 
// specifying the Swagger JSON endpoint.
app.UseSwaggerUI(c => {
     c.SwaggerEndpoint("swagger/latest/swagger.json", "DynaFile Web API");
     c.RoutePrefix = string.Empty; //To serve the Swagger UI at the app's root
}

显然我的控制器也不需要知道我的应用程序名称。例如:

[Route("~/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
   ....
}
于 2018-11-14T16:47:15.900 回答