[英]Swagger isn't working in OWIN Startup Web API C#
我已經在我的 Web API 的 OWIN startup.cs 文件中實現了 Swagger,但是當我嘗試打開 Swagger UI 頁面時,它顯示 HTTP 錯誤 404.0 - 未找到
URL 查看 Swagger UI: https://localhost:5001/swagger
這是我的實現,請幫助我我所缺少的。
啟動.cs
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Map("/api", map => { ConfigureApiArea(map); });
}
private void ConfigureApiArea(IAppBuilder map)
{
var config = CreateTypedConfiguration<BaseApiController>();
//Json Settings
JsonFormatterSettings(config);
ConfigureAutofac(config, map);
ConfigureOAuth(map);
config.EnableCors(new EnableCorsAttribute("*", "*", "*", "Paging-Headers,X-Error"));
map.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
config.EnsureInitialized();
map.UseWebApi(config);
}
private HttpConfiguration CreateTypedConfiguration<TBaseController>() where TBaseController : IHttpController
{
var config = new HttpConfiguration();
config.Services.Replace(typeof(IHttpControllerTypeResolver), new
TypedHttpControllerTypeResolver<TBaseController>());
config.EnableSwagger();
config.MapHttpAttributeRoutes(new TypedDirectRouteProvider<TBaseController>());
return config;
}
}
SwaggerExtensions.cs
public static class SwaggerExtensions
{
public static HttpConfiguration EnableSwagger(this HttpConfiguration httpConfiguration)
{
httpConfiguration
.EnableSwagger(c => c.SingleApiVersion("v1", "MyWebAPI"))
.EnableSwaggerUi();
return httpConfiguration;
}
}
我的控制器.cs
public class MyController : BaseApiController
{
[AllowAnonymous]
[HttpGet]
[Route("orders/{orderId}")]
public IHttpActionResult GetOrder([FromUri]string orderId) {
return Ok();
}
}
BaseApiController.cs
public class BaseApiController : ApiController { }
正如@Dai 所建議的那樣,它實際上是https://localhost:5001/api/swagger
,它不起作用的原因是因為方法ConfigureAutofac(config, map)
中的自定義MessageHandlers
(OP 的代碼中未顯示)沒有處理帶有/swagger
路徑的請求。
ConfigureAutofac(config, map)
方法中的MessageHandler
代碼省略:
private void ConfigureAutofac(HttpConfiguration config, IAppBuilder app)
{
var builder = new ContainerBuilder();
//code omitted for brevity ...
//Register Web API controllers.
builder.RegisterApiControllers(Assembly.GetExecutingAssembly())
.InstancePerRequest();
//Register the Autofac filter provider.
builder.RegisterWebApiFilterProvider(config);
//Register the Autofac model binder provider.
builder.RegisterWebApiModelBinderProvider();
//code omitted for brevity ...
var container = builder.Build();
//Set the dependency resolver to be Autofac.
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
config.MessageHandlers.Insert(0, new ApiDelegatingHandler());
config.MessageHandlers.Insert(1, new ActivityLogHandler());
app.UseAutofacMiddleware(container);
app.UseAutofacWebApi(config);
}
自定義MessageHandler
所需的唯一更改是處理此問題,如下所示:
public class ApiDelegatingHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (request.RequestUri.PathAndQuery.Contains("/swagger"))
return await base.SendAsync(request, cancellationToken);
//code omitted for brevity ...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.