web-dev-qa-db-ja.com

.NET Core 2.0-「Access-Control-Allow-Origin」ヘッダーエラーがまだ表示されない

私はこれで途方に暮れています。私はすでにSO運が無ければ、同様の質問に対する他の回答を調査しました。

CORSを正しく有効にしてすべての発信元からの着信要求(この場合はPOST要求))を許可したのはかなり確かですが、以下のエラーが表示されます。

読み込みに失敗しました http:// localhost:5000/expenses :リクエストされたリソースに「Access-Control-Allow-Origin」ヘッダーがありません。したがって、オリジン ' http:// localhost:42 'はアクセスを許可されません。応答のHTTPステータスコードは500でした。

これが、webAPIプロジェクトでCORSを有効にする方法です。

Startup.csの関連メソッド

_ // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors();
            services.AddMvc();

            services.AddDbContext<ExpensesDbContext>(options =>
                                                    options.UseMySQL(Configuration.GetConnectionString("DefaultConnection")));
            services.AddTransient<IBaseDa<Accounts>, AccountsDataAccess>();
            services.AddTransient<IExpensesDa, ExpensesDa>();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            env.EnvironmentName = "Development";

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseCors(builder => builder
                        .AllowAnyHeader()
                        .AllowAnyMethod()
                        .AllowAnyOrigin()
                        .AllowCredentials());

            app.UseMvc();
        }
_

.AllowAnyOrigin()および.AllowAnyMethod()を使用している場合、上記のエラーが表示されるのはなぜですか?

7
Steve Boniface

この状況でしばらく頭を悩ませていました。 CORSを適切に有効にしましたが、一部の呼び出しでAccess-Control-Allow-Originエラーが返されました。私は問題を見つけました...卑劣な卑劣な問題...

_app.UseExceptionHandler_の使用方法が原因で発生した問題。具体的には、元のコードにcontext.Response.Headers.Add("Access-Control-Allow-Origin", "*");行がなかったことを除いて、使用していたコードは次のとおりです。

_app.UseExceptionHandler(errorApp =>
{
    errorApp.Run(async context =>
    {
        var errorFeature = context.Features.Get<IExceptionHandlerFeature>();
        var exception = errorFeature.Error;

        var problemDetails = new ProblemDetails
        {
            Title = R.ErrorUnexpected,
            Status = status,
            Detail =
              $"{exception.Message} {exception.InnerException?.Message}"
        };

        context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
        context.Response.StatusCode = problemDetails.Status.GetValueOrDefault();
        context.Response.WriteJson(problemDetails, "application/problem+json");

        await Task.CompletedTask;
    });
});
_

_app.UseExceptionHandler_は、コントローラーアクションよりもはるかに低レベルの関数であるため、ネイティブにCORSに関連するものには参加しません。 context.Response.Headers.Add("Access-Control-Allow-Origin", "*");を追加すると、問題が修正されました。

3
Alex Dresko

私の水晶玉は、C#コードのどこかに実行時にエラーが表示され、このようにしてサービスの「return」ステートメントが実行されないことを示しています。コードをデバッグし、エラーを修正して、応答がブラウザーに返されるようにします。

1
Pavel Aslanov

NetCore2.0の組み合わせ( http:// localhost:5000 / )+ Angular( http:// localhost:42 ) + chrome = Access-Control-Allow-Origin。以前にこの問題があり、chromeが常にこのエラーをスローすることを認識するのに3日かかりましたchromeはlocalhostがポートを無視していると見なしているため、ミドルウェアが特にPOSTリクエストに対して明示的に指示していない場合でも、.

私はあなたのstartup.cs Configureサービスでポリシーを定義してみます:

  public void ConfigureServices(IServiceCollection services)
        {
  //add cors service
            services.AddCors(options => options.AddPolicy("Cors",
                builder =>
                {
                    builder.AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader();
                }));

次に、Configureメソッドに追加します。

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            //authentication added 
            app.UseAuthentication();

            app.UseCors("Cors");
            app.UseMvc();
        }

...これはおそらく機能しませんが、誰でも試してみてください...これは私を怒らせたので、リクエストがasp.netCoreバックエンドをヒットしようとしたかどうかを確認するだけで満足する必要がありました。

本当に表示したい場合は、キャッシュとCookieをクリアしてから、IHttpContextAccessorを追加して、リクエストで行われていることを低レベルで制御します。同じ問題のジレマでangular=画像を送信する必要がありました。私はannyoing Originエラーを取得していたので、エクスペリメントを使用して、IHttpContextAccessorをコントローラーに挿入し、

デバッグ

public void ConfigureServices(IServiceCollection services)
{
  //add cors service
                services.AddCors(options => options.AddPolicy("Cors",
                    builder =>
                    {
                        builder.AllowAnyOrigin()
                        .AllowAnyMethod()
                        .AllowAnyHeader();
                    }));

    services.AddMvc();

         // register an IHttpContextAccessor so we can access the current
            // HttpContext in services by injecting it
            //---we use to this pull out the contents of the request

    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

あなたはこれをどんなコントローラーにも注入したい

POSTリクエストのjsonオブジェクトを取得するために使用しています。この例をホームコントローラとして使用します。

public class HomeController : Controller
    {

        // make a read only field
        private readonly IHttpContextAccessor _httpContextAccessor;

    //create ctor for controller and inject it
    public UserService(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    // now in your post method use this to see what the if anything came in through the request:
    public async Task<IActionResult> Picload(IFormFile file){//---always null

    // in my problem I was loading and image from.
    var file =  _httpContextAccessor.HttpContext.Request.Form.Files[0];
}

これを使用すると、画像にアクセスできましたchromeで、Originエラーが発生していました。

1