[英]Asp.Net Core WebAPI CORS Not working
我正在嘗試使用.Net Core實現WebAPI服務,我無法設置CORS正常工作。
我得到了主應用程序'MainApp',它將動態生成Invoice,我想將其作為服務進行推廣。 這不是純粹的WebAPI應用程序。 我只想添加這個InvoiceController作為WebAPI,還有其他控制器,如HomeController,ProductsController等...帶有視圖和cshtml。
我得到了單獨的Classic WebForm .Net Application,它將通過Ajax調用InvoiceGeneration Service並在網站上顯示值。
當我運行我的ajax腳本時,我得到了這個着名的CORS錯誤。
這是我的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值。
由於我使用Policy和Claims來確定安全性,因此我將AllowAnonymous
屬性。 即使我刪除了這個限制,它仍然無法正常工作。
public class InvoiceController : Controller
{
[HttpGet]
[AllowAnonymous]
[EnableCors("AllowAll")]
public async Task<IActionResult> Test(string id)
{
return new JsonResult(id);
}
}
Startup.cs
我添加了AllowAll Policy以允許所有類型的請求。
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 Core服務,我設法使用相同的'AllowAll Policy'代碼正確設置CORS。 我可以使用這個簡單的Jquery腳本從任何跨域網站調用該服務。
$.ajax({
type: "GET",
url: 'http://oakapi/staff/byid/2618',
dataType: 'json',
contentType: 'application/json',
success: function (data) {
console.log(data);
}
});
我認為service.AddCors()應該放在service.AddMvc()之前。
像這樣設置ajax:
$.ajax({
type: "GET",
url: 'http://oakapi/staff/byid/2618',
dataType: 'jsonp',
contentType: 'application/javascript',
success: function (data) {
console.log(data);
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.