我試圖通過對.NET核心來實現的WebAPI服務,我不能設法建立CORS正常工作。Asp.Net核心的WebAPI CORS不工作
我的主應用程序「MainApp」和它會動態生成的發票,我想,以促進它的服務。這不是純粹的WebAPI應用程序。我只想添加這個InvoiceController作爲WebAPI,並且還有其他控制器,如HomeController,ProductsController等等,以及views和cshtml。
我這是要調用InvoiceGeneration服務通過Ajax與顯示值在網站上單獨經典的WebForm的.Net應用。
當我跑我的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值。
由於我使用的政策和索賠,以確定安全,我把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);
}
});
我很好奇,你的[EnableCors]你使用的是什麼依賴關係?它是Microsoft.AspNet.Cors嗎? – jomsk1e
它來自Microsoft.AspNetCore.Cors。理論上,我們不需要使用它,因爲我們在全局的Startup.cs中設置它。我只是放了那個,因爲我的解決方案都沒有工作,並嘗試所有的鏡頭。 – TTCG