C# 如何仅将COR添加到aspnet core中的某些请求
目前,我的app builder管道看起来像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 =>
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(应用程序、环境);
}
}