ASP.NETコアAPIと私のAngularクライアントに問題があります。APIとAngularの間の接続を確立するためにSignalRを実装したいと思います。corsポリシーは、クライアントとAPIを使用すると、クライアントからAPIからデータを取得できますが、SignalRを使用しようとするとCORS POLICYでエラーが発生します。
Origin ' http:// localhost:42 'からの ' http:// localhost:50501/CoordinatorHub/negotiate 'でのXMLHttpRequestへのアクセスがCORSポリシーによってブロックされました:応答プリフライト要求はアクセス制御チェックに合格しません。要求されたリソースに「Access-Control-Allow-Origin」ヘッダーがありません。
しかし、APIのStartup.cs内にはすでにcorsポリシーがあり、次のようになっています。
ConfigureServicesメソッドで:
services.AddCors(options =>
{
options.AddPolicy("AllowSpecificOrigin",
builder =>
builder.WithOrigins("http://localhost:4200/")
.AllowCredentials()
//.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.SetIsOriginAllowedToAllowWildcardSubdomains());
});
そして、Configureメソッドの内部:
app.UseCors("AllowSpecificOrigin");
クライアントでは、APIとクライアントの間の接続を確立しようとするだけで、次のようになります。
this.hubConnection.start({withCredentials: false}).then(() =>
this.hubConnection.invoke('send', 'Hello'));
注これは.net core 3.1に適用できます
Microsoftのドキュメントに記載されているように、動作しないようです docs
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// Preceding code ommitted.
app.UseRouting();
app.UseCors();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
// Following code ommited.
}
警告
エンドポイントルーティングでは、UseRoutingとUseEndpointsの呼び出し間で実行されるようにCORSミドルウェアを構成する必要があります。構成が正しくないと、ミドルウェアが正しく機能しなくなります。
ただし、最初にUseCors()を移動すると、アプリケーションは期待どおりに機能するため、機能するコードは次のようになります。
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
options.AddDefaultPolicy(builder => builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()));
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//place your useCors here
app.UseCors();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
// Following code ommited.
}
スタートアップ構成クラスで次のようなことを試してください:
app.Map("/CoordinatorHub/negotiate", map =>
{
map.UseCors(CorsOptions.AllowAll);
var hubConfiguration = new HubConfiguration
{
// You can enable JSONP by uncommenting line below.
// EnableDetailedErrors = true,
// EnableJSONP = true
};
map.RunSignalR(hubConfiguration);
});
私はこれに従って私の問題を解決しました link
このブロックコードをサービスに追加
services.AddCors(options => options.AddPolicy("CorsPolicy",
builder =>
{
builder.AllowAnyHeader()
.AllowAnyMethod()
.SetIsOriginAllowed((Host) => true)
.AllowCredentials();
}));
アプリの構成にこのブロックコードを追加します
app.UseCors("CorsPolicy");
app.UseSignalR(routes =>
{
routes.MapHub<General>("/hubs/general");
});