2016-11-21 11 views
2

私はコアをバックエンドとして使用している新しいmvcコアアプリケーションに取り組んでおり、私はフロントエンドとして反応しています。asp.netコアmvc​​ corsリクエストが拒否されました

私は私のmvcコアバックエンドに向かって私の反応から何かを投稿することができないcorsの問題に実行を開始しました。いずれか助けていません

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

      services.Configure<MvcOptions>(options => 
      { 
       options.Filters.Add(new CorsAuthorizationFilterFactory("AllowSpecificOrigin")); 
      }); 

、今私は本当に私のポストの要求以外に何が起こっているのかさっぱりだが:文書に見ると、非常に参考にしても、すべてを可能にすることにより、「焦土」アプローチを取っていません拒否されています。次のように

私の行動が見えます:次のように反応するから

[HttpPost("_api/admin/monitor-customer")] 
    public IActionResult SetCustomerMonitor([FromBody]UpdateMonitor model){ 
     try 
     { 
      var customer = Customers.Single(c => c.CustomerId == model.Id); 
      customer.IsMonitored = !customer.IsMonitored; 

      _context.SaveChanges(); 

      return Json(new { success = true }); 
     } catch(Exception ex){ 
      _logger.LogDebug(ex.Message, null); 
      return Json(new { success = false }); 
     } 
    } 

マイポスト要求は次のとおりです。

updateCustomer = (e) => { 
    var customerId = e.target.value; 

    $.ajax({ 
     type: "POST", 
     contentType: 'application/json; charset=utf-8', 
     url: "http://localhost:5000/_api/admin/monitor-customer", 
     data: JSON.stringify({ Id: customerId }), 
     dataType: "json" 
     }); 
} 

も含め、私のStartup.cs

public class Startup 
{ 
    public Startup(IHostingEnvironment env) 
    { 
     var builder = new ConfigurationBuilder() 
      .SetBasePath(env.ContentRootPath) 
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true); 

     if (env.IsDevelopment()) 
     { 
      builder.AddUserSecrets(); 
     } 

     builder.AddEnvironmentVariables(); 
     Configuration = builder.Build(); 
    } 

    public IConfigurationRoot Configuration { get; } 
    ILogger _logger; 
    // This method gets called by the runtime. Use this method to add services to the container. 
    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddDbContext<AlertContext>(options => options.UseSqlite(Configuration.GetConnectionString("DefaultSqlite"))); 
     //services.AddDbContext<AlertContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 

     services.AddScoped<DbContext, AlertContext>(); 
     services.AddSingleton<IDmsService>(new DmsService()); 

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

     services.Configure<MvcOptions>(options => 
     { 
      options.Filters.Add(new CorsAuthorizationFilterFactory("AllowSpecificOrigin")); 
     }); 
    } 

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     if (env.IsDevelopment()) 
     { 
      app.UseDeveloperExceptionPage(); 
      app.UseDatabaseErrorPage(); 
      app.UseBrowserLink(); 
     } 
     else 
     { 
      app.UseExceptionHandler("/Home/Error"); 
     } 

     app.UseCors(options => options.AllowAnyHeader()); 
     app.UseCors(options => options.AllowAnyMethod()); 
     app.UseCors(options => options.AllowAnyOrigin()); 

     app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 
     }); 
    } 
} 

答えて

2

問題は解決され、どこにコアが有効になっているかを示します。

service.AddCors()はConfigureServicesメソッドのservices.AdMvc()より先になければなりません。これはConfigure()メソッドでも同様です。 app.UseMvc()の前にapp.UseCors()を呼び出す必要があります。

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddDbContext<AlertContext>(options => options.UseSqlite(Configuration.GetConnectionString("DefaultSqlite"))); 
     //services.AddDbContext<AlertContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 

     services.AddScoped<DbContext, AlertContext>(); 
     services.AddSingleton<IDmsService>(new DmsService()); 

     // Add service and create Policy with options 
     services.AddCors(options => 
     { 
      options.AddPolicy("CorsPolicy", 
       builder => builder.AllowAnyOrigin() 
       .AllowAnyMethod() 
       .AllowAnyHeader() 
       .AllowCredentials()); 
     }); 

     services.AddMvc(); 
    } 

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     if (env.IsDevelopment()) 
     { 
      app.UseDeveloperExceptionPage(); 
      app.UseDatabaseErrorPage(); 
      app.UseBrowserLink(); 
     } 
     else 
     { 
      app.UseExceptionHandler("/Home/Error"); 
     } 

     // global policy - assign here or on each controller 
     app.UseCors("CorsPolicy"); 

     app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 
     }); 
    }