asp.net信号器核心中的跨域请求不起作用?

时间:2019-03-14 09:38:02

标签: c# asp.net-core asp.net-core-signalr

我正在使用asp.net core 2.2版本的asp.net core signalr 1.1.0。我想
向Web客户端和移动客户端进行跨域请求。 当我从javascript客户端发送请求时,此请求被阻止,并显示以下错误, (索引):1已从CORS策略阻止从源“ https://localhost:44373/chatHub/negotiate?token=12”访问“ https://localhost:44381”处的XMLHttpRequest:对预检请求的响应未通过访问控制检查:“ Access”的值当请求的凭据模式为“包括”时,响应中的“ -Control-Allow-Origin”标头不得为通配符“ *”。 XMLHttpRequest发起的请求的凭据模式由withCredentials属性控制。

我的Javascript客户端代码

var connection = new signalR.HubConnectionBuilder().withUrl("https://localhost:44373/chatHub?token="+12).build();

Signalr核心服务启动类代码

 // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
            services.AddCors(options =>
            {
                options.AddPolicy("CorsPolicy",
                    builder => builder.AllowAnyOrigin()/*WithOrigins("https://localhost:44381")*/
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials());
            });

            services.AddSignalR();

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            //services.AddCors();

        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }


            app.UseHttpsRedirection();
            app.UseCors("CorsPolicy");

            app.UseSignalR(routes =>
            {
                routes.MapHub<ChatHub>("/chatHub");
            });
            //app.UseStaticFiles();
            //app.UseCookiePolicy();
            app.UseMvc();
        }


builder.AllowAnyOrigin() its not working 

builder => builder.WithOrigins(“ https://localhost:44381”))起作用了,但这是特定于此原点的, 我要制作AllowAnyOrigin()??

2 个答案:

答案 0 :(得分:0)

我以这种方式工作

在顶部的“配置服务”上

class BeaconService : Service(), BeaconConsumer {
    private var beaconManager: BeaconManager? = null
    private var rangingTimer = Timer("rangingTimer", true)
    private val region = Region("com.beacon.test", Identifier.parse("f7826da6-4fa2-4e98-8024-bc5b71e0893e"), null, null)

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        return Service.START_STICKY
    }

    override fun onCreate() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val notificationManager = MyNotificationManager.getInstance()
            val notification = notificationManager.buildBeaconServiceNotification(this, "iBeacon service", null)
            startForeground(NOTIFICATION_ID, notification)
        }

        initBeaconManager()
    }

    private fun initBeaconManager() {
        BeaconManager.setDebug(true)
        beaconManager = BeaconManager.getInstanceForApplication(this)
        beaconManager?.foregroundScanPeriod = 200L
        beaconManager?.beaconParsers?.add(BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"))
        beaconManager?.bind(this)
    }

    override fun onBeaconServiceConnect() {
        beaconManager?.addRangeNotifier { beacons, _ ->
            if (beacons.isNotEmpty()) {
                //code add ranged beacons to list
            }
        }
        startRanging()
    }

    private fun startRanging() {

        //code to reset the list of ranged beacons

        beaconManager?.startRangingBeaconsInRegion(region)

        rangingTimer.schedule(10000L) {
            stopRanging(50000L)
        }

    }

    private fun stopRanging(restartRangingAfter: Long? = null) {
        beaconManager?.stopRangingBeaconsInRegion(region)

        //code calcuate the strongest beacon and submit to server

        if (restartRangingAfter != null) {
            rangingTimer.schedule(restartRangingAfter) {
                startRanging()
            }
        }
    }
}

以及在Configure方法中

 services.AddCors();

可以在此处找到整个代码。过去对我来说效果很好。我最近没打开过

Github Repo

答案 1 :(得分:0)

我发现您的代码有两个问题。让我们一一解决。

  1. 即使您仅需要SignalR连接,也允许整个应用程序使用所有起源。如果您只想对signalR端点应用CORS策略,请考虑以下代码

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapHub<UsersHub>("/UsersHub")
                .RequireCors((policyBuilder) => policyBuilder
                     .WithOrigins("clientUrls")
                     .AllowAnyMethod()
                     .AllowAnyHeader()
                     .AllowCredentials()
        });
    
  2. 建议不允许所有来源,但是如果您有这样的用例,则以下变通办法可以解决您的问题。这是使用.SetIsOriginAllowed(_ => true)

    的技巧
                     .SetIsOriginAllowed(_ => true)
                     .AllowAnyMethod()
                     .AllowAnyHeader()
                     .AllowCredentials()
    

如果您需要更多信息,请查看此guide以获得更多详细信息。