C# 当API被分成多个项目时,Asp.NETCore会生成404

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 {

我正在尝试为我必须创建的API开发可重用代码,但有一个问题让我困惑了几天。当所有代码都驻留在一个项目中,
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);