ASP.NET 核心 WebAPI 崩溃是因为我没有 StaticFileMiddleware?
ASP.NET Core WebAPI crashes because I don't have StaticFileMiddleware?
我正在尝试构建一个简单的 WebAPI,为 Web 应用程序提供 JSON 数据,但由于某种原因,每次调用都以找不到任何内容而告终。
我有一个带有路由的控制器:
[Produces("application/json")]
[Route("api/Players")]
public class PlayersController : Controller
{
[HttpGet("{name}", Name = "GetPlayer")]
public Player Get(string name)
{
return playerService.GetPlayer(name);
}
playerservice 方法只是 returns 一个 dto。不幸的是,这个端点甚至没有被调用。
请求管道被调用,然后因 System.MissingMethodException: 'Method not found: 'Void Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware..ctor
而崩溃,尽管我什至没有尝试获取任何静态文件,只是 /api/players/dummy
或 /swagger
、none 工作。这里的调用堆栈只是 Program.Main 然后是外部代码。
ConfigureServices 开始
services.AddMvcCore().AddApiExplorer();
services.AddSwaggerGen(c => c.SwaggerDoc("v1", new Info { Title = "API", Version = "v1" }));
services.AddControllers();
配置成功
app.UseSwagger()
.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "API v1"))
.UseRouting()
.UseEndpoints(endpoints => endpoints.MapControllers());
我的管道配置不正确吗?尽管我什至不提供静态文件,但我是否需要一些静态文件中间件?我做错了什么?
编辑:异常截图:
这是异常的堆栈跟踪,它似乎是大摇大摆地发生的:
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.CreateStaticFileMiddleware(RequestDelegate next, IHostingEnvironment hostingEnv, ILoggerFactory loggerFactory, SwaggerUIOptions options)
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware..ctor(RequestDelegate next, IHostingEnvironment hostingEnv, ILoggerFactory loggerFactory, SwaggerUIOptions options)
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Microsoft.Extensions.Internal.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider)
at Microsoft.Extensions.Internal.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.<>c__DisplayClass4_0.<UseMiddleware>b__0(RequestDelegate next)
at Microsoft.AspNetCore.Builder.ApplicationBuilder.Build()
at Microsoft.AspNetCore.Hosting.WebHost.BuildApplication()
at Microsoft.AspNetCore.Hosting.WebHost.<StartAsync>d__27.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at Microsoft.AspNetCore.Hosting.WebHostExtensions.<RunAsync>d__5.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Microsoft.AspNetCore.Hosting.WebHostExtensions.<RunAsync>d__5.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at Microsoft.AspNetCore.Hosting.WebHostExtensions.<RunAsync>d__4.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at Microsoft.AspNetCore.Hosting.WebHostExtensions.Run(IWebHost host)
at Teambuilder_WebAPI.Program.Main(String[] args) in D:\Sources\Teambuilder\Teambuilder WebAPI\Program.cs:line 11
Swashbuckle.AspNetCore 软件包的第 5 版处于预发布阶段,预计会出现问题。
正如 OP 确认的那样,this github issue 与此问题有关,因此解决方案将更新到最新版本。
更新:正如 OP 确认的那样,您可以将最新稳定版的 Swashbuckle v4.0.1 与 .Net Core v3.1 和你很高兴。
我正在尝试构建一个简单的 WebAPI,为 Web 应用程序提供 JSON 数据,但由于某种原因,每次调用都以找不到任何内容而告终。
我有一个带有路由的控制器:
[Produces("application/json")]
[Route("api/Players")]
public class PlayersController : Controller
{
[HttpGet("{name}", Name = "GetPlayer")]
public Player Get(string name)
{
return playerService.GetPlayer(name);
}
playerservice 方法只是 returns 一个 dto。不幸的是,这个端点甚至没有被调用。
请求管道被调用,然后因 System.MissingMethodException: 'Method not found: 'Void Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware..ctor
而崩溃,尽管我什至没有尝试获取任何静态文件,只是 /api/players/dummy
或 /swagger
、none 工作。这里的调用堆栈只是 Program.Main 然后是外部代码。
ConfigureServices 开始
services.AddMvcCore().AddApiExplorer();
services.AddSwaggerGen(c => c.SwaggerDoc("v1", new Info { Title = "API", Version = "v1" }));
services.AddControllers();
配置成功
app.UseSwagger()
.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "API v1"))
.UseRouting()
.UseEndpoints(endpoints => endpoints.MapControllers());
我的管道配置不正确吗?尽管我什至不提供静态文件,但我是否需要一些静态文件中间件?我做错了什么?
编辑:异常截图:
这是异常的堆栈跟踪,它似乎是大摇大摆地发生的:
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.CreateStaticFileMiddleware(RequestDelegate next, IHostingEnvironment hostingEnv, ILoggerFactory loggerFactory, SwaggerUIOptions options)
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware..ctor(RequestDelegate next, IHostingEnvironment hostingEnv, ILoggerFactory loggerFactory, SwaggerUIOptions options)
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Microsoft.Extensions.Internal.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider)
at Microsoft.Extensions.Internal.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.<>c__DisplayClass4_0.<UseMiddleware>b__0(RequestDelegate next)
at Microsoft.AspNetCore.Builder.ApplicationBuilder.Build()
at Microsoft.AspNetCore.Hosting.WebHost.BuildApplication()
at Microsoft.AspNetCore.Hosting.WebHost.<StartAsync>d__27.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at Microsoft.AspNetCore.Hosting.WebHostExtensions.<RunAsync>d__5.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Microsoft.AspNetCore.Hosting.WebHostExtensions.<RunAsync>d__5.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at Microsoft.AspNetCore.Hosting.WebHostExtensions.<RunAsync>d__4.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at Microsoft.AspNetCore.Hosting.WebHostExtensions.Run(IWebHost host)
at Teambuilder_WebAPI.Program.Main(String[] args) in D:\Sources\Teambuilder\Teambuilder WebAPI\Program.cs:line 11
Swashbuckle.AspNetCore 软件包的第 5 版处于预发布阶段,预计会出现问题。
正如 OP 确认的那样,this github issue 与此问题有关,因此解决方案将更新到最新版本。
更新:正如 OP 确认的那样,您可以将最新稳定版的 Swashbuckle v4.0.1 与 .Net Core v3.1 和你很高兴。