C# 如何仅将COR添加到aspnet core中的某些请求

C# 如何仅将COR添加到aspnet core中的某些请求,c#,asp.net-core,C#,Asp.net Core,目前,我的app builder管道看起来像 public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHostingEnvironment env) { app.MapWhen((ctx) => { return ctx.Request.Host.Host == "api.example.com"; }, innerbuilder =>

目前,我的app builder管道看起来像

public void Configure(IApplicationBuilder app,
    Microsoft.AspNetCore.Hosting.IHostingEnvironment env)
{
    app.MapWhen((ctx) =>
    {
        return ctx.Request.Host.Host == "api.example.com";
    }, innerbuilder =>
    {
        innerbuilder.UseCors("ApiCorsPolicy");
        app.UseMvc(); //This is for the api subdomain
    });

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();

        // to do - wire in our HTTP endpoints
        app.Use(async(ctx, next) =>
        {
            if (Path.GetExtension(ctx.Request.Path) == ".ts" ||
                Path.GetExtension(ctx.Request.Path) == ".tsx")
            {
                await ctx.Response.WriteAsync(
                    File.ReadAllText(
                        ctx.Request.Path.Value.Substring(1)));
            }
            else
            {
                await next();
            }

        });
    }

    app.UseSignalR(routes =>
    {
        routes.MapHub<DataNotificationHub>("/hubs/notifications");
    });

    app.UseStaticFiles();
    app.UseMvc(); //This is for the webpage on www
}
public void配置(IApplicationBuilder应用程序,
Microsoft.AspNetCore.Hosting.IHostingEnvironment环境)
{
app.MapWhen((ctx)=>
{
返回ctx.Request.Host.Host==“api.example.com”;
},innerbuilder=>
{
innerbuilder.UseCors(“ApiCorsPolicy”);
app.UseMvc();//这是用于api子域的
});
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
//我们的HTTP端点中的to-do-wire
应用程序使用(异步(ctx,下一步)=>
{
if(Path.GetExtension(ctx.Request.Path)=“.ts”||
Path.GetExtension(ctx.Request.Path)=“.tsx”)
{
等待ctx.Response.WriteAsync(
File.ReadAllText(
ctx.Request.Path.Value.Substring(1));
}
其他的
{
等待下一个();
}
});
}
app.usesigner(路由=>
{
routes.MapHub(“/hubs/notifications”);
});
app.UseStaticFiles();
app.UseMvc();//这是用于www
}
我不知道使用两个UseMvc和mapwhen是否有任何缺点

但我现在做的似乎是多余的,我想知道是否有更好的方法


基本上,该应用程序服务于“门户”和“api”,其中api位于子域api.example.com下。是否有更好的方法只向api部分添加COR?也许稍后会出现我只想在api.example.com主机名上显示的其他内容,mapWhen是最佳选项吗?

我决定将其拆分为两个启动类,然后将它们托管在两个单独的进程中。我这样做是因为从长远来看,它更容易分离/维护

然后,我刚刚创建了一个开发启动程序,在本地开发时使用这两者

public class ApiStartup
{
    public void ConfigureContainer(IUnityContainer container)
    {
        container.RegisterInstance("This string is displayed if container configured correctly",
                                   "This string is displayed if container configured correctly");

        CustomAuthStorageExtensions.Initialize();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(o => o.AddPolicy("ApiCorsPolicy", builder =>
        {
            builder.AllowAnyOrigin()
                   .AllowAnyMethod()
                   .AllowAnyHeader()
                   .SetPreflightMaxAge(TimeSpan.FromHours(1));
        }));


        IsoDateTimeConverter dateConverter = new IsoDateTimeConverter
        {
            DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'"
        };

        services.AddMvc(o =>
        {
            o.ModelBinderProviders.Insert(0, new RowModelBinderProvider());
        }).AddRazorPagesOptions(o =>
        {

        }).AddJsonOptions(o =>
        {

            o.SerializerSettings.Converters.Add(dateConverter);


        });


        services.AddSingleton(new MessageProcessorOptions
        {
            ConcurrentMessagesProcesses = 3,
            QueuePath = "earthml-pimeter",
            ListenerConnectionStringKey = "PimetrServiceBus",
        });
        services.AddTransient<IMessageHandler<StorageProviderMessage>, ProviderMessageHandler>();
        services.AddSingleton<IHostedService, ResourceProviderMessageProcessorHostedService>();

    }


    public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHostingEnvironment env)
    {
        app.UseCors("ApiCorsPolicy");
    }

}

public class PortalStartup
{
    public void ConfigureContainer(IUnityContainer container)
    {
        container.RegisterInstance("This string is displayed if container configured correctly",
                                   "This string is displayed if container configured correctly");

        CustomAuthStorageExtensions.Initialize();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton(new CDNHelper());

        IsoDateTimeConverter dateConverter = new IsoDateTimeConverter
        {
            DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'"
        };

        services.AddMvc();

        services.AddSignalR(o =>
        {

        }).AddJsonProtocol(j =>
        {
            j.PayloadSerializerSettings.Converters.Add(dateConverter);
        });

    }

    public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHostingEnvironment env)
    {

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();

            // to do - wire in our HTTP endpoints
            app.Use(async (ctx, next) =>
            {
                if (Path.GetExtension(ctx.Request.Path) == ".ts" || Path.GetExtension(ctx.Request.Path) == ".tsx")
                {

                    await ctx.Response.WriteAsync(File.ReadAllText(ctx.Request.Path.Value.Substring(1)));
                }
                else
                {
                    await next();
                }

            });
        }


        app.UseSignalR(routes =>
        {
            routes.MapHub<DataNotificationHub>("/hubs/notifications");
        });

        app.UseStaticFiles();

        app.UseMvc();
    }
}

public class DevStartup
{
    private PortalStartup PortalStartup = new PortalStartup();
    private ApiStartup ApiStartup = new ApiStartup();

    public void ConfigureContainer(IUnityContainer container)
    {
        ApiStartup.ConfigureContainer(container);
    }
    public void ConfigureServices(IServiceCollection services)
    {
        ApiStartup.ConfigureServices(services);
        PortalStartup.ConfigureServices(services);
    }

    public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHostingEnvironment env)
    {
        PortalStartup.Configure(app, env);
    }

}
公共类API启动
{
公共无效配置容器(IUnityContainer容器)
{
container.RegisterInstance(“如果容器配置正确,则显示此字符串”,
“如果容器配置正确,则显示此字符串”);
CustomAuthStorageExtensions.Initialize();
}
public void配置服务(IServiceCollection服务)
{
services.AddCors(o=>o.AddPolicy(“ApiCorsPolicy”,builder=>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.SetPreflightMaxAge(TimeSpan.FromHours(1));
}));
IsoDateTimeConverter dateConverter=新的IsoDateTimeConverter
{
DateTimeFormat=“yyyy'-'MM'-'dd'T'HH':'MM':'ss.fff'Z'”
};
services.AddMvc(o=>
{
o、 插入(0,新的RowModelBinderProvider());
}).AddRazorPagesOptions(o=>
{
}).AddJsonOptions(o=>
{
o、 SerializerSettings.Converters.Add(日期转换器);
});
services.AddSingleton(新的MessageProcessorOptions
{
ConcurrentMessagesProcesses=3,
QueuePath=“earthml pimeter”,
ListenerConnectionStringKey=“PimetrServiceBus”,
});
services.AddTransient();
services.AddSingleton();
}
public void Configure(IApplicationBuilder应用程序,Microsoft.AspNetCore.Hosting.IHostingEnvironment env)
{
附录UseCors(“ApiCorsPolicy”);
}
}
公共类PortalStartup
{
公共无效配置容器(IUnityContainer容器)
{
container.RegisterInstance(“如果容器配置正确,则显示此字符串”,
“如果容器配置正确,则显示此字符串”);
CustomAuthStorageExtensions.Initialize();
}
public void配置服务(IServiceCollection服务)
{
AddSingleton(新的CDNHelper());
IsoDateTimeConverter dateConverter=新的IsoDateTimeConverter
{
DateTimeFormat=“yyyy'-'MM'-'dd'T'HH':'MM':'ss.fff'Z'”
};
services.AddMvc();
services.AddSignalR(o=>
{
}).addjson协议(j=>
{
j、 PayloadSerializerSettings.Converters.Add(日期转换器);
});
}
public void Configure(IApplicationBuilder应用程序,Microsoft.AspNetCore.Hosting.IHostingEnvironment env)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
//我们的HTTP端点中的to-do-wire
应用程序使用(异步(ctx,下一步)=>
{
if(Path.GetExtension(ctx.Request.Path)=“.ts”| Path.GetExtension(ctx.Request.Path)=“.tsx”)
{
等待ctx.Response.WriteAsync(File.ReadAllText(ctx.Request.Path.Value.Substring(1));
}
其他的
{
等待下一个();
}
});
}
app.usesigner(路由=>
{
routes.MapHub(“/hubs/notifications”);
});
app.UseStaticFiles();
app.UseMvc();
}
}
公共类DevStartup
{
private PortalStartup PortalStartup=新PortalStartup();
私有ApiStartup ApiStartup=新ApiStartup();
公共无效配置容器(IUnityContainer容器)
{
ApiStartup.ConfigureContainer(container);
}
public void配置服务(IServiceCollection服务)
{
ApiStartup.ConfigureServices(服务);
PortalStartup.ConfigureServices(服务);
}
public void Configure(IApplicationBuilder应用程序,Microsoft.AspNetCore.Hosting.IHostingEnvironment env)
{
PortalStartup.Configure(应用程序、环境);
}
}