【发布时间】:2019-08-11 23:02:35
【问题描述】:
我有一个项目MyProject.Api,其结构如下:
Controllers/
- Api/
- UsersController.cs
- HomeController.cs
Startup.cs
HomeController.cs 如下所示:
namespace MyProject.Api.Controllers
{
public class HomeController : Controller
{
private readonly IHostingEnvironment _hostingEnvironment;
public HomeController(IHostingEnvironment hostingEnv) {...}
[HttpGet]
public async Task<IActionResult> Index() {...}
[HttpGet("sitemap.xml")]
public IActionResult SiteMap() {...}
[HttpGet("error")]
public IActionResult Error() {...}
}
}
和 UsersController.cs 看起来像这样:
namespace MyProject.Api.Controllers.Api
{
[Route("api/[controller]")]
public class UsersController : Controller
{
private readonly ApiHelper<UsersController> _apiHelper;
private readonly IUserService _userService;
public UsersController(ILogger<UsersController> logger, IUserService userService) {...}
[HttpPost("login")]
public async Task<JsonResult> Login([FromBody] LoginRequest request) {...}
[HttpPost("register")]
public async Task<JsonResult> Register([FromBody] RegisterRequest request) {...}
[HttpGet("renew")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public async Task<JsonResult> Renew() {...}
}
}
和Startup.cs:
namespace MyProjet.Api
{
public class Startup
{
private IConfiguration Configuration { get; }
public Startup(IConfiguration configuration) {...}
public void ConfigureServices(IServiceCollection services)
{
...
services.AddSwaggerGen(c => c.SwaggerDoc("v1", new Info {Title = "Web Api Docs", Version = "v1"}));
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.UseSwagger();
app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); });
app.MapWhen(x => !x.Request.Path.Value.StartsWith("/swagger", StringComparison.OrdinalIgnoreCase), builder =>
{
builder.UseMvc(routes =>
{
routes.MapSpaFallbackRoute(
"spa-fallback",
new {controller = "Home", action = "Index"});
});
});
}
}
}
当我加载 /swagger 时,UI 加载成功,但出现以下错误:
Fetch error
Internal Server Error /swagger/v1/swagger.json
并且在服务器端出现此错误
System.NotSupportedException: Ambiguous HTTP method for action - WebEssentials.AspNetCore.Pwa.PwaController.ServiceWorkerAsync (WebEssentials.AspNetCore.Pwa). Actions require an explicit HttpMethod binding for Swagger 2.0
at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.CreatePathItem(IEnumerable`1 apiDescriptions, ISchemaRegistry schemaRegistry)
at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GetSwagger(String documentName, String host, String basePath, String[] schemes)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Microsoft.AspNetCore.SpaServices.Webpack.ConditionalProxyMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.SpaServices.Webpack.ConditionalProxyMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)
但所有方法都有唯一的路由、唯一的名称,并且它们的 HTTP 方法是明确绑定的。我尝试将[Route("")] 添加到HomeController.cs,但这也不起作用。
我做错了什么?
【问题讨论】:
-
堆栈跟踪表明
WebEssentials.AspNetCore.Pwa.PwaController.ServiceWorkerAsync处的方法需要显式的 HttpMethod 绑定。不幸的是,控制器在第三方库中。所以你最好的选择是不使用那个库 -
@devNull 我一定是瞎子!谢谢!
-
我通过将 [HttpGet] 添加到相关的 Action 解决了同样的问题。
标签: c# asp.net asp.net-core asp.net-web-api swagger