私はここで何か間違ったことをしているに違いありませんが、それを理解することはできません。私の知る限り、これはCORSの問題のようです。 Access-Control-Expose-Headers: *
を任意のOriginに公開する必要がありますが、dotnet core2.1が期待どおりに動作していません。
関連するStartup.csコード:
public void ConfigureServices(IServiceCollection services)
{
//Mapping settings to POCO and registering with container
var settings = new AppSettings.ReportStorageAccountSettings();
Configuration.Bind(nameof(AppSettings.ReportStorageAccountSettings), settings);
services.AddCors(options =>
{
options.AddPolicy("AllowAll",
builder =>
{
builder
.AllowAnyHeader()
.AllowAnyMethod()
.AllowAnyOrigin()
.AllowCredentials();
});
});
services.AddSingleton(settings);
services.AddApiVersioning();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
// 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.UseHsts();
}
app.UseCors("AllowAll");
app.UseHttpsRedirection();
app.UseMvc();
}
このアプリケーションはAzureでホストされており、念のため、AzureのCORS設定に*
エントリを追加しました。これで、クライアントアプリケーション(Azureでもホストされている)がPOSTリクエストを行うたびに、JS経由でヘッダーにアクセスできなくなり、応答にAccess-Control-Expose-Headers: *
が表示されなくなります。ただし、ネットワーク応答を調べたり、Fiddlerを使用したりすると、ヘッダーが表示されます。 JSの問題を除外するために、ヘッダーにアクセスするためにAxiosとJqueryを試しました。私はここで何が間違っているのですか?
コントローラーでは、次のように応答します。
Response.Headers.Add("Location", $"api/someLocation");
return StatusCode(StatusCodes.Status202Accepted);
CorsPolicyBuilder
の- AllowAnyHeader
メソッドは Access-Control-Allow-Headers
応答ヘッダー。これは プリフライトされたリクエスト にのみ使用されます。 Access-Control-Expose-Headers
応答ヘッダーは必要なものであり、 WithExposedHeaders
を使用して構成されます。
完全な例を次に示します。
services.AddCors(options =>
{
options.AddPolicy("AllowAll", builder =>
{
builder.AllowAnyHeader()
.AllowAnyMethod()
.AllowAnyOrigin()
.AllowCredentials()
.WithExposedHeaders("Location"); // params string[]
});
});