web-dev-qa-db-ja.com

AspNetCore.SignalR 2.1およびCORS

SignalR-Serviceを新しいAspNetCore.SignalR(2.1プレビュー)に移行していますが、CORSで問題が発生します。同じOriginからサービスにアクセスすることはないため、一般的にCORSを無効にする必要があります。

次のCORSポリシーがあります

services.AddCors(
            options => options.AddPolicy("AllowCors",
                builder =>
                {
                    builder
                        .AllowAnyOrigin()
                        .AllowCredentials()
                        .AllowAnyHeader()
                        .AllowAnyMethod();
                })
        );

(異なるOriginからのWebApi-Controller呼び出しはこれらのポリシーで正常に機能しています)

AspNetCoreのSignalRの古いプレビューパッケージ(AspNetCore.SignalR.Server)を使用しても問題はありませんが、テストクライアントはCORSの問題のように見えるhttp-405を取得しました。

SignalRに追加のCORS設定があるのでしょうか、それとも何か他のものを許可する必要がありますか?

編集:ここでエラーが発生しているかどうかを確認するための特別なミドルウェアなしで、新鮮な/クリーンなサンプルプロジェクトを作成しました。

サンプルWebApplication | startup.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using WebApplication1.HUBs;

namespace WebApplication1
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors(
                options => options.AddPolicy("AllowCors",
                    builder =>
                    {
                        builder
                            .AllowAnyOrigin()
                            .AllowCredentials()
                            .AllowAnyHeader()
                            .AllowAnyMethod();
                    })
            );
            services.AddMvc();
            services.AddSignalR(options =>
            {
            });
        }
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseCors("AllowCors");
            app.UseMvc();
            app.UseSignalR(routes =>
            {
                routes.MapHub<TestHub>("/test");
            });
        }
    }
}

Winformsアプリケーションのサンプル

        private HubConnection _hubConnection;
    private void button1_Click(object sender, EventArgs e)
    {
        var connection = new HubConnectionBuilder().WithUrl("http://localhost:63771/test")
            .WithConsoleLogger()
            .WithTransport(Microsoft.AspNetCore.Sockets.TransportType.WebSockets)
            .Build();
        connection.StartAsync();
    }

Winforms Application ConsoleOutputのサンプル

fail: Microsoft.AspNetCore.Sockets.Client.HttpConnection[8]
   01/10/2018 15:25:45: Failed to start connection. Error getting negotiation response from 'http://localhost:63771/test'.
System.Net.Http.HttpRequestException: Response status code does not indicate success: 405 (Method Not Allowed).
   bei System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()
   bei Microsoft.AspNetCore.Sockets.Client.HttpConnection.<Negotiate>d__42.MoveNext()
15
slxSlashi

このようにapp.UseSignalR()の上にapp.UseMvc()を移動してみてください

app.UseCors("AllowCors");
app.UseSignalR(routes =>
    {
        routes.MapHub<TestHub>("/test");
    });
app.UseMvc();
5
user9496864

私は同じ問題を抱えていました、私はクライアントサイドにreactjsを使用しています。バージョンを"@aspnet/signalr-client"から"@aspnet/signalr"に変更して問題を解決しました

4
cimbru

これは私には機能せず、微妙に異なるバージョンが機能しました-

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
  ...
  app.UseCors(builder => builder
    .AllowAnyHeader()
    .AllowAnyMethod()
    .SetIsOriginAllowed((Host) => true)
    .AllowCredentials()
  );

  app.UseSignalR(routes => { routes.MapHub<ChatHub>("/chatHub"); });
  app.UseMvc();
}
4
Ian Grainger

Preview1にアップグレードするとき、パッケージを@aspnet/signalrにアップグレードする必要があります:

注:JavaScript用のSignalRクライアントライブラリの以前のプレビューは、@ aspnet/signalr-clientという名前でした。これはプレビュー1で非推奨になりました。

ソース:Github readme

1
Peter

問題を解決しました。

クライアントパッケージとサーバーパッケージは、正確なSubversion状態ではありませんでした。 2.1-preview3210および2.1-preview3209(例番号)でした。

サーバーパッケージは頻繁にナゲットフィードに公開されますが、クライアントパッケージ(npm)は公開されません。だから私は自分で最新のgitリポジトリをクローンし、libsをビルドすると動作します。

これで問題は発生しなくなり、クライアントパッケージは最新になりました。

0
slxSlashi