1.我們都知道.net core的跨域問題處理,此處我們簡單描述下,我們可以通過自定義中間件CorsSetup.cs來實作自定義多個域名之前的跨域通路,代碼如下:
/// <summary>
/// Cors 跨域 啟動服務
/// </summary>
public static class CorsSetup
{
public static void AddCorsSetup(this IServiceCollection services)
{
if (services == null) throw new ArgumentNullException(nameof(services));
services.AddCors(c =>
{
c.AddPolicy("LimitRequests", policy =>
{
// 支援多個域名端口,注意端口号後不要帶/斜杆:比如localhost:8000/,是錯的
// 注意,http://127.0.0.1:1818 和 http://localhost:1818 是不一樣的,盡量寫兩個
policy
.WithOrigins(Appsettings.app(new string[] { "Startup", "Cors", "IPs" }).Split(','))
.AllowAnyHeader()//Ensures that the policy allows any header.
.SetIsOriginAllowed(str => true)
.AllowCredentials()
.AllowAnyMethod();
});
});
}
}
2.在Startup.cs的Configure方法中進行調用上述自定義中間件
app.UseCors("LimitRequests");
3.這樣我們的.Net Core的跨域問題就輕松解決了,然後部署、上線,你會突然發現你的signalr是調不通的(如果是跨域調用的話),原因是:signalr的跨域跟.net core的跨域,它不是一回事,因為signalr實際就是WebSocket,CORS 提供的保護不适用于 WebSocket,是以就會出現:跨域請求接口OK,但是singnlar就會報錯、無響應等,這個時候我們需要單獨對Signalr進行跨域配置,代碼如下:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapHub<ChatHub>("/api/chatHub/signalr")
.RequireCors(policy =>
{
// 支援多個域名端口,注意端口号後不要帶/斜杆:比如localhost:8000/,是錯的
// 注意,http://127.0.0.1:1818 和 http://localhost:1818 是不一樣的,盡量寫兩個
policy
.WithOrigins(Appsettings.app(new string[] { "Startup", "Cors", "IPs" }).Split(','))
.AllowAnyHeader()//Ensures that the policy allows any header.
.SetIsOriginAllowed(str => true)
.AllowCredentials()
.AllowAnyMethod();
});
});
4.此處提醒下:我們調用自定義Cors的時候的順序,一定是在app.UseRouting()和app.UseAuthorization()中間,即:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL1EEVNJTR61ENFpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2kjN3ADNzIjMzEDNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
如果順序不是這樣的話,那麼可能會出現400的請求錯誤
5.補充:
ASP.NET Core 中的安全注意事項 SignalR
(CORS) 啟用跨域請求 ASP.NET Core
ASP.NET Core 中間件順序