C# 当API被分成多个项目时,Asp.NETCore会生成404
我正在尝试为我必须创建的API开发可重用代码,但有一个问题让我困惑了几天。当所有代码都驻留在一个项目中,C# 当API被分成多个项目时,Asp.NETCore会生成404,c#,asp.net-core,C#,Asp.net Core,我正在尝试为我必须创建的API开发可重用代码,但有一个问题让我困惑了几天。当所有代码都驻留在一个项目中,WebAPI并且公共代码存在于名为Core的文件夹中时,一切正常 现在,如果我把Core中的代码放在自己的项目WebAPI.Core中,API会启动,会大摇大摆地加载,但每个请求都会生成404。我已经缩小了问题的范围,只有当启动和程序在不同的项目中时才会出现问题。这是故意的行为,还是我做错了什么 以下是启动,它位于WebAPI.Core项目中: public class Startup {
WebAPI
并且公共代码存在于名为Core
的文件夹中时,一切正常
现在,如果我把Core
中的代码放在自己的项目WebAPI.Core
中,API会启动,会大摇大摆地加载,但每个请求都会生成404。我已经缩小了问题的范围,只有当启动
和程序
在不同的项目中时才会出现问题。这是故意的行为,还是我做错了什么
以下是启动
,它位于WebAPI.Core
项目中:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddApiVersioning(options =>
{
options.UseApiBehavior = false;
options.ReportApiVersions = true;
options.ApiVersionReader = new HeaderApiVersionReader("api-version");
options.AssumeDefaultVersionWhenUnspecified = true;
});
services.AddMvc(options => { options.EnableEndpointRouting = false; });
services.AddVersionedApiExplorer(options =>
{
options.GroupNameFormat = "'v'VVV";
options.SubstituteApiVersionInUrl = true;
});
services
.AddControllers(options => options.Filters.Add(new ErrorFilter()))
.AddJsonOptions(options => options.JsonSerializerOptions.IgnoreNullValues = true);
}
public void Configure(IApplicationBuilder app)
{
const string swagger = "Swagger";
app.UseMvc(routes => routes.MapRoute("default", "/{controller}/{action}/{*id}", new {id = string.Empty}));
app.UseRouting();
app.UseEndpoints(builder => builder.MapControllers());
var directory = Combine(Api.CurrentDirectory, swagger);
if (Exists(directory))
{
Delete(directory, true);
}
CreateDirectory(directory);
app.UseDefaultFiles().UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(directory),
RequestPath = $"/{swagger}"
});
Api.Assembly.CreateDocuments(AppSettings["Title"], AppSettings["Description"], AppSettings["Name"], AppSettings["Email"], directory);
app.UseSwaggerUI(setupAction =>
{
setupAction.RoutePrefix = string.Empty;
foreach (var file in GetFiles(directory))
{
var fileName = GetFileNameWithoutExtension(file);
setupAction.SwaggerEndpoint($"/{swagger}/{fileName}.json", fileName.Replace("-", " "));
}
});
}
}
以下是Api
,它是启动
和程序
之间的链接,也位于WebAPI.Core
:
public static class Api
{
public static void Run<TStartup>(this Assembly assembly, string[] args) where TStartup : Startup
{
Assembly = assembly;
CurrentDirectory = GetDirectoryName(UnescapeDataString(new UriBuilder(assembly.CodeBase).Path));
CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<TStartup>(); }).Build().Run();
}
public static Assembly Assembly { get; private set; }
public static string CurrentDirectory { get; private set; }
}
正如在其中一条评论中指出的,我丢失了一个指向API程序集的链接 发件人: 致:
下面是一些关于链接程序集的非常奇怪的方法的额外信息。您可以尝试使用控制器创建单独的类库,只需使用一行代码将程序集添加到主应用程序中。请参见此处的接受答案@pwrigshihanomoronimo添加此
services.AddMvc(options=>{options.EnableEndpointRouting=false;}).AddApplicationPart(Api.Assembly)代码>修复了该问题。谢谢很高兴它有帮助,您可能希望自己发布解决方案,以避免将来有人来(寻找积分)
public static class Program
{
public static void Main(string[] args)
{
GetExecutingAssembly().Run<Startup>(args);
}
}
services.AddMvc(options => { options.EnableEndpointRouting = false; });
services.AddMvc(options => { options.EnableEndpointRouting = false; }).AddApplicationPart(Api.Assembly);