C# 虚张声势的5罐';我找不到我的APIController
我的WebAPI 2项目确实需要API文档,我使用了Swashback 5 NuGet包。开箱即用,我可以点击{myrooturl}/swagger,弹出一个UI,但里面没有控制器、方法或任何东西。只是我的标题:[基本url:/EM.Services,api版本:v1] 我查看了Swashback文档,由于我使用的是由IIS托管的OWIN,因此我使用以下内容修改了SwaggerConfig:C# 虚张声势的5罐';我找不到我的APIController,c#,iis,asp.net-web-api,swashbuckle,C#,Iis,Asp.net Web Api,Swashbuckle,我的WebAPI 2项目确实需要API文档,我使用了Swashback 5 NuGet包。开箱即用,我可以点击{myrooturl}/swagger,弹出一个UI,但里面没有控制器、方法或任何东西。只是我的标题:[基本url:/EM.Services,api版本:v1] 我查看了Swashback文档,由于我使用的是由IIS托管的OWIN,因此我使用以下内容修改了SwaggerConfig: c.RootUrl(req => req.RequestUri.GetLeftPart(UriPa
c.RootUrl(req => req.RequestUri.GetLeftPart(UriPartial.Authority) + req.GetRequestContext().VirtualPathRoot.TrimEnd('/'));
根据本文件:
我还设置了项目的构建以生成XML文档,并使用以下命令将我的SwaggerConfig指向它:
private static string GetXmlCommentsPath()
{
// tried with an without the \bin
return String.Format(@"{0}\bin\EM.Services.XML", AppDomain.CurrentDomain.BaseDirectory);
}
不过,我不确定XML文档是否正常工作与此有关,因为我在swagger ui页面上完全没有控制器
值得一提的是,我的所有控制器都继承自BaseController,BaseController又继承自ApiController
我的网页有什么问题吗
public static void Register(HttpConfiguration config)
{
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
config.Filters.Add(new ValidateModelAttribute());
config.Filters.Add(new BaseAuthenticationAttribute());
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
jsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
}
而我的基本控制器(目前)做的并不多,只是有一个属性:
[BuildClaims]
public abstract class BaseController : ApiController
使用IIS Express或完整版IIS时,空页会在整个系统中持续存在
更新:
我制作的人工控制器的示例非常基本。它也没有出现,因为我仍然有锅炉板招摇过市的用户界面,其中没有任何内容
/// <summary>
/// I am a test
/// </summary>
[RoutePrefix("api/dummy")]
public class DummyController : ApiController
{
[HttpGet]
[Route("foo")]
public int Foo()
{
return 42;
}
}
//
///我是一个测试
///
[RoutePrefix(“api/虚拟”)]
公共类DummyController:ApiController
{
[HttpGet]
[路线(“foo”)]
公共int Foo()
{
返回42;
}
}
Swashback位于WebApi元数据层的顶部ApiExplorer
。它从ApiExplorer获取操作描述,然后将它们映射到招摇过市的描述
由于您的控制器继承自BASECONTROLLER而非APICONTROLLER,因此它将无法工作
根据JimWolleys的评论
private IEnumerable<ApiDescription> GetApiDescriptionsFor(string apiVersion)
{
return (_options.VersionSupportResolver == null)
? _apiExplorer.ApiDescriptions
: _apiExplorer.ApiDescriptions.Where(apiDesc => _options.VersionSupportResolver(apiDesc, apiVersion));
}
private IEnumerable我发现了问题。在创建了一个空的测试项目之后,我注意到WebApiConfiguration是从global.asax app start注册的,而不是从OWIN startup类注册的(和我一样)
由于Swagger/Swashback正在连接到GlobalConfiguration,而且鉴于OWIN startup和Global.asax生活在不同的环境中(我认为),修复方法是连接您的WebAPI材料,从Global.asax注册,并让OWIN的应用程序对象使用WebAPI
相关位:
// global asax
protected void Application_Start(object sender, EventArgs e)
{
GlobalConfiguration.Configure(WebApiConfig.Register);
// ... more stuff
}
//startup.cs
public void Configuration(IAppBuilder app)
{
// This must happen FIRST otherwise CORS will not work.
app.UseCors(CorsOptions.AllowAll);
HttpConfiguration config = new HttpConfiguration();
ConfigureAuth(app);
// webapi is registered in the global.asax
app.UseWebApi(config);
}
如上所述重新布线后,我现在可以在swagger UI中看到控制器和操作。我卡住了。。这些答案并没有完全帮助我。。。虽然他们带我去了那里。只是为了节省别人一些时间:
您必须从OWIN传递http配置,然后在该配置上注册,而不是像这样使用GlobalConfiguration类:
//starup.cs
public void Configuration(IAppBuilder app)
{
Config = new HttpConfiguration();
WebApiConfig.Register(Config);
app
.UseResponseLogging()
.UseRequestLogging()
.UseHttpErrors()
.UseExceptionLogging()
.UseWebApi(Config);
HandlerConfig.Register(Config);
SwaggerConfig.Register(Config);
}
在swagger配置文件中,将register方法更改为:
public static void Register(HttpConfiguration config)
{
var thisAssembly = typeof(SwaggerConfig).Assembly;
config
.EnableSwagger(c =>
{...
希望这有帮助。我发现这个链接非常有用。这个特定的解决方案是针对Microsoft.Azure.Mobile.Server API的,但它为我解决了这个问题
我发现我也有同样的问题。我创建了一个扩展方法来提供帮助
using Swashbuckle.Application;
using System.Web.Http;
public static class SwaggerExtensions
{
public static HttpConfiguration EnableSwagger(this HttpConfiguration httpConfiguration)
{
httpConfiguration
.EnableSwagger(c => c.SingleApiVersion("v1", "A title for your API"))
.EnableSwaggerUi();
return httpConfiguration;
}
}
然后在我的Startup.cs中
public class Startup
{
public void Configuration(IAppBuilder appBuilder)
{
HttpConfiguration httpConfiguration = new HttpConfiguration();
httpConfiguration
.EnableSwagger() // <==== EXTENSION METHOD <==== //
.MapHttpAttributeRoutes();
httpConfiguration.Routes.MapHttpRoute(
"DefaultApi",
"api/{controller}/{id}",
new {id = RouteParameter.Optional});
appBuilder
.UseWebApi(httpConfiguration);
}
}
公共类启动
{
公共无效配置(IAppBuilder appBuilder)
{
HttpConfiguration HttpConfiguration=新的HttpConfiguration();
http配置
.EnableSwagger()//所有这些解决方案对我都有效,但它们都只是针对我的问题的恶意攻击。经过几个小时的调查,我发现问题在于我还使用了一瞥(或其他更改路由表的包)
以下是一个很好的总结:
Spile在HttpWebRoute之上添加了castle代理。因此HostedHttpRouteCollection是RouteProxy的集合,而不是
HttpWebRoute
APIExplorer类有flattRoutes方法,该方法在HostedHttpRouteCollection上执行foreach循环
GetEnumeratorHostedHttpRouteCollection的实现专门查找HttpWebRoute。请参阅下面的代码。自
已添加代理,枚举器始终返回0个路由
public override IEnumerator GetEnumerator()
{
// Here we only care about Web API routes.
return _routeCollection
.OfType()
.Select(httpWebRoute => httpWebRoute.HttpRoute)
.GetEnumerator();
}
公共重写IEnumerator GetEnumerator()
{
//这里我们只关心Web API路由。
返回路径集合
第()类
.Select(httpWebRoute=>httpWebRoute.HttpRoute)
.GetEnumerator();
}
我很惊讶没有解决方案,您可以选择您想要使用的:虚张声势或一瞥,但不能同时使用
当然,您可以尝试使用其中一种解决方法,但存在意外行为和棘手错误的风险。我自己也遇到过同样的问题,但这些都没有帮助到我
经过一番周折后,我发现我标记为[System.Web.Mvc.Route(“visit”)]
的路由并没有被斯威格发现
[HttpGet]
// ROUTE ATTRIBUTE NOT FOUND BY SWAGGER
[System.Web.Mvc.Route("visit")]
public string Visit()
{
但是[System.Web.Http.Route(“visit”)]
是
[HttpGet]
// ROUTE ATTRIBUTE *IS* FOUND BY SWAGGER
[System.Web.Http.Route("visit")]
public string Visit()
{
我不是100%确定,但如果有关系的话,我也从
public class MyAPIController : Controller
致:
更准确地说,我删除了System.Web.Mvc的“using”语句,但列出的代码只是为了说明
希望这对将来的其他人有所帮助:)祝你好运!我在Owin+Swashback集成方面遇到了很多问题,但没有一个答案能为我解决所有问题。长话短说,我设法解决了所有问题,并创建了一个开源回购协议,作为任何需要它的人的模板
请检查:我在使用OWIN时也遇到了此问题。通过按照中的建议仅安装Swashbuckler Core并编辑Startup.cs解决了此问题,如下所示:
// Startup.cs
// ...
HttpConfiguration config = new HttpConfiguration();
// ...
config
.EnableSwagger(c =>
{
////add if there's custom root path
//c.RootUrl(req =>
// req.RequestUri.GetLeftPart(UriPartial.Authority) +
// req.GetRequestContext().VirtualPathRoot.TrimEnd('/'));
c.SingleApiVersion("v1", "A title for your API");
})
.EnableSwaggerUi();
// ...
appBuilder.UseWebApi(config);
我熟悉自动扩展控制器的.NET核心版本Swashback。当我在开发一个框架(非核心)API时,当我最终设法显示一些东西时,我感到困惑,因为我不知道单击“显示/隐藏”,仍然认为它不起作用
默认情况下,您可以使用以下命令展开它:
.EnableSwaggerUi(c => {
c.DocExpansion(DocExpansion.List);
});
在我的情况下,我有一个类似的问题,亚历克斯C。我必须做两件事来修复
// Startup.cs
// ...
HttpConfiguration config = new HttpConfiguration();
// ...
config
.EnableSwagger(c =>
{
////add if there's custom root path
//c.RootUrl(req =>
// req.RequestUri.GetLeftPart(UriPartial.Authority) +
// req.GetRequestContext().VirtualPathRoot.TrimEnd('/'));
c.SingleApiVersion("v1", "A title for your API");
})
.EnableSwaggerUi();
// ...
appBuilder.UseWebApi(config);
.EnableSwaggerUi(c => {
c.DocExpansion(DocExpansion.List);
});
using System.Web.Mvc;
[RoutePrefix("v1/Awesome")]
[RoutePrefix("v1/Amazing")]
public class AmazingController : ApiController