天天看點

.Net Core通過Signalr搭建WebIM,跨域問題處理

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()中間,即:

.Net Core通過Signalr搭建WebIM,跨域問題處理

如果順序不是這樣的話,那麼可能會出現400的請求錯誤

.Net Core通過Signalr搭建WebIM,跨域問題處理
.Net Core通過Signalr搭建WebIM,跨域問題處理

5.補充:

ASP.NET Core 中的安全注意事項 SignalR

(CORS) 啟用跨域請求 ASP.NET Core

ASP.NET Core 中間件順序