2017-02-23 127 views
4

我試圖通過對.NET核心來實現的WebAPI服務,我不能設法建立CORS正常工作。Asp.Net核心的WebAPI CORS不工作

我的主應用程序「MainApp」和它會動態生成的發票,我想,以促進它的服務。這不是純粹的WebAPI應用程序。我只想添加這個InvoiceController作爲WebAPI,並且還有其他控制器,如HomeController,ProductsController等等,以及views和cshtml。

我這是要調用InvoiceGeneration服務通過Ajax與顯示值在網站上單獨經典的WebForm的.Net應用。

當我跑我的AJAX腳本,我得到了這個著名的CORS錯誤。

enter image description here

這是我的AJAX GET方法。無論我是否放入xhrFields都沒有關係。我甚至改變了dataType: 'jsonp',它仍然給我同樣的錯誤。

$.ajax({ 
       type: "GET", 
       url: 'http://localhost:57012/invoice/test/123', 
       dataType: 'json',     
       contentType: 'application/json', 
       success: function (data) {      
        console.log(data); 
       }, 
       xhrFields: { 
        withCredentials: true 
       } 
      }); 

InvoiceController.cs

我的發票服務是很簡單的...只是一個方法,其返回一些JSON值。

由於我使用的政策和索賠,以確定安全,我把AllowAnonymous屬性。即使我刪除了這個限制,它仍然不起作用。

public class InvoiceController : Controller 
    {   
     [HttpGet] 
     [AllowAnonymous]   
     [EnableCors("AllowAll")] 
     public async Task<IActionResult> Test(string id) 
     { 

      return new JsonResult(id); 
     } 
    } 

Startup.cs

我加AllowAll政策,允許所有類型的請求。

public void ConfigureServices(IServiceCollection services) 
      { 
       services.AddDbContext<DbContexts.PJDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("PJConnection"))); 

       services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 

       services.AddMvc() 
        .AddJsonOptions(o => o.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore) 
        .AddJsonOptions(o => o.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver()); 

       services.AddCors(options => options.AddPolicy("AllowAll", p => p.AllowAnyOrigin() 
                   .AllowAnyMethod() 
                   .AllowAnyHeader() 
                   .AllowCredentials()));  


       services.AddAuthorization(options => 
       { 
        options.AddPolicy(Constants.CONST_POLICY_SUPERADMIN, policy => policy.RequireRole(Constants.CONST_ROLE_SUPERADMIN)); 
        options.AddPolicy(Constants.CONST_POLICY_STUDENT, policy => policy.RequireRole(Constants.CONST_ROLE_STUDENT, Constants.CONST_ROLE_ADMIN, Constants.CONST_ROLE_SUPERADMIN)); 
       }); 
      } 

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

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

       app.UseStaticFiles(); 

       if (env.IsProduction()) 
       { 
        app.UseStaticFiles(new StaticFileOptions() 
        { 
         FileProvider = new PhysicalFileProvider(AppSettings.Value.FilePathToUpload), 
         RequestPath = new PathString("/Files"), 
        }); 
       } 

       app.UseCookieAuthentication(new CookieAuthenticationOptions 
       { 
        AuthenticationScheme = "Cookie", 
        LoginPath = new PathString("/Account/Login/"), 
        AccessDeniedPath = new PathString("/Account/Forbidden/"), 
        AutomaticAuthenticate = true, 
        AutomaticChallenge = true 
       }); 

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

這是有趣的部分。

我創建了另一個新的.Net Core WebAPI項目,並將此CORS安裝程序複製到Startup.cs和InvoiceController以發佈到新項目中。 CORS工作正常,我的AJAX可以從新項目中調用該方法。

但我不想讓多個項目,我不能將WebAPI嵌入到現有的MVC WebApp項目中?

我已經看到一些教程在同一個項目中同時運行WebAPI和MVC控制器(顯然它們在同一個域中,所以CORS對它們來說不是問題)。很混亂。

請問你們能幫我嗎?

PS。這Html5Rocks教程js腳本不起作用。

在我看來,我不覺得有什麼不對JqueryAJAX腳本。 我得到了另一個純WebAPI .Net核心服務,並且我設法使用相同的'AllowAll Policy'代碼正確設置了CORS。我可以使用這個簡單的Jquery腳本從任何跨域網站調用該服務。

$.ajax({ 
       type: "GET", 
       url: 'http://oakapi/staff/byid/2618', 
       dataType: 'json',     
       contentType: 'application/json', 
       success: function (data) { 
        console.log(data); 
       }    
      }); 
+0

我很好奇,你的[EnableCors]你使用的是什麼依賴關係?它是Microsoft.AspNet.Cors嗎? – jomsk1e

+0

它來自Microsoft.AspNetCore.Cors。理論上,我們不需要使用它,因爲我們在全局的Startup.cs中設置它。我只是放了那個,因爲我的解決方案都沒有工作,並嘗試所有的鏡頭。 – TTCG

回答

-1

集阿賈克斯這樣的:

$.ajax({ 
      type: "GET", 
      url: 'http://oakapi/staff/byid/2618', 
      dataType: 'jsonp',     
      contentType: 'application/javascript', 
      success: function (data) { 
       console.log(data); 
      }    
     }); 
0

我認爲service.AddCors()應service.AddMvc之前放在()。