簡體   English   中英

Swagger 在 OWIN 啟動中不起作用 Web API C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM