TTC*_*TCG 5 cors asp.net-web-api asp.net-core asp.net-core-webapi
我正在尝试使用.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
}
});
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
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?}");
});
}
Run Code Online (Sandbox Code Playgroud)
这是有趣的部分.
我创建了另一个新的.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);
}
});
Run Code Online (Sandbox Code Playgroud)
小智 -1
像这样设置ajax:
$.ajax({
type: "GET",
url: 'http://oakapi/staff/byid/2618',
dataType: 'jsonp',
contentType: 'application/javascript',
success: function (data) {
console.log(data);
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1465 次 |
| 最近记录: |