摇摇欲坠的用户界面在webapi中未显示任何内容

cs0*_*815 5 structuremap swagger swagger-ui asp.net-web-api2 swashbuckle

我跟着这个到XML文档的一部分,以便使用Swashbuckle创建扬鞭文档。它应该允许我通过以下方式查看端点:

http:// localhost:51854 / swagger / ui / index

不幸的是,我看不到任何端点:

在此处输入图片说明

任何想法为什么以及如何解决这个问题?请注意,我是从一个空的webapi项目创建了我的webapi的-也许就是这个问题。一定有一些东西不见了,但我不确定...

现在,我确定了以下代码是根本原因。在Global.asax.cs中:

var container = new XyzWebApiStructureMapContainerConfigurator().Configure(GlobalConfiguration.Configuration);
GlobalConfiguration.Configuration.Services
.Replace(typeof(IHttpControllerActivator),
new StructureMapHttpControllerActivator(container));
Run Code Online (Sandbox Code Playgroud)

一些课程:

public class XyzWebApiStructureMapContainerConfigurator
{
    public IContainer Configure(HttpConfiguration config)
    {
        var container = new Container(new BlaWebApiRegistry());
        config.DependencyResolver = new StructureMapDependencyResolver(container);
        return container;
    }
}

public class StructureMapDependencyResolver : StructureMapDependencyScope, IDependencyResolver, IHttpControllerActivator
{
    private readonly IContainer _container;

    public StructureMapDependencyResolver(IContainer container)
        : base(container)
    {
        _container = container;
        container.Inject<IHttpControllerActivator>(this);
    }

    public IDependencyScope BeginScope()
    {
        return new StructureMapDependencyScope(_container.GetNestedContainer());
    }

    public IHttpController Create(
        HttpRequestMessage request,
        HttpControllerDescriptor controllerDescriptor,
        Type controllerType)
    {
        var scope = request.GetDependencyScope();
        return scope.GetService(controllerType) as IHttpController;
    }
}
Run Code Online (Sandbox Code Playgroud)

PS:

简化的控制器代码:

[RoutePrefix("api/XYZ")]
public class BlaController : ApiController
{
    private readonly ISomething _something;

    public BlaController(ISomething something)
    {
        _something = something;
    }

    [Route("")]
    [HttpGet]
    public IHttpActionResult Resources([FromUri] BlaRequest blaRequest)
    {
        // something exciting
        return Ok(returnObject);
    }
}
Run Code Online (Sandbox Code Playgroud)

PPS:

更多代码:

// WebApiConfig

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services  

    // Web API routes
    config.MapHttpAttributeRoutes();

    //var cors = new EnableCorsAttribute("*", "*", "*");
    config.EnableCors();

    config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
    );
}
Run Code Online (Sandbox Code Playgroud)

// Global.asax.cs

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);

        GlobalConfiguration.Configuration.Formatters.Clear();
        GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());

        var container = new XyzWebApiStructureMapContainerConfigurator().Configure(GlobalConfiguration.Configuration);
        GlobalConfiguration.Configuration.Services
        .Replace(typeof(IHttpControllerActivator),
            new StructureMapHttpControllerActivator(container));
    }
}
Run Code Online (Sandbox Code Playgroud)

PPPS:

{
swagger: "2.0",
info: {
version: "v1",
title: "Bla.Di.Bla"
},
host: "localhost:51854",
schemes: [
"http"
],
paths: { },
definitions: { }
}
Run Code Online (Sandbox Code Playgroud)

Hoo*_*ini 0

就我而言,问题是由 IIS Express 虚拟目录引起的,以下是详细说明:

我有一个 API 项目,项目属性如下所示:

在此输入图像描述

这些属性写入applicationhost.config文件,位于:MySolutionPath\.vs\MySolution\config

这是存储虚拟目录信息的文件部分:

<sites>
  <site name="MyProject" id="3">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
      <virtualDirectory path="/" physicalPath="C:\MyProjectPath\MyProject" />
    </application>
    <bindings>
      <binding protocol="https" bindingInformation="*:44334:localhost" />
      <binding protocol="http" bindingInformation="*:53242:localhost" />
    </bindings>
  </site>
  ..
</sites>
Run Code Online (Sandbox Code Playgroud)

一切都工作正常...

然后我开始遵循本指南,该指南要求我将项目 URL 更改为:https://localhost:44334/Swagger

在此输入图像描述

我这样做了,然后单击“创建虚拟目录”按钮。

这样做对applicationhost.config文件进行了以下更改:

<sites>
  <site name="MyProject" id="3">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
      <virtualDirectory path="/" physicalPath="C:\MyProjectPath\MyProject" />
    </application>
    <application path="/Swagger" applicationPool="Clr4IntegratedAppPool">
      <virtualDirectory path="/" physicalPath="C:\Shopless\shopless.source\Shopless.Api" />
    </application>
    <bindings>
      <binding protocol="https" bindingInformation="*:44334:localhost" />
      <binding protocol="http" bindingInformation="*:53242:localhost" />
    </bindings>
  </site>
  ..
</sites>
Run Code Online (Sandbox Code Playgroud)

这就是问题所在,因为现在路径/Swagger指向我项目的根目录。

为了解决这个问题,我必须从applicationhost.config文件中删除新部分,并将项目 URL 更改回其原始值。