加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-web-api – Asp.Net核心WebAPI CORS无效

发布时间:2020-12-16 07:38:43 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试使用.Net Core实现WebAPI服务,我无法设置CORS正常工作. 我得到了主应用程序’MainApp’,它将动态生成Invoice,我想将其作为服务进行推广.这不是纯粹的WebAPI应用程序.我只想添加这个InvoiceController作为WebAPI,还有其他控制器,如HomeController,P
我正在尝试使用.Net Core实现WebAPI服务,我无法设置CORS正常工作.

我得到了主应用程序’MainApp’,它将动态生成Invoice,我想将其作为服务进行推广.这不是纯粹的WebAPI应用程序.我只想添加这个InvoiceController作为WebAPI,还有其他控制器,如HomeController,ProductsController等…带有视图和cshtml.

我得到了单独的Classic WebForm .Net Application,它将通过Ajax调用InvoiceGeneration Service并在网站上显示值.

当我运行我的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值.

由于我使用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',success: function (data) {
                    console.log(data);
                }             
            });

解决方法

我认为service.AddCors()应该放在service.AddMvc()之前.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读