asp.net-web-api - Asp.Net Core WebAPI CORS 不工作

标签 asp.net-web-api asp.net-core cors asp.net-core-webapi

我正在尝试使用 .Net Core 来实现 WebAPI 服务,但无法设置 CORS 正常工作。

我得到了主应用程序“MainApp”,它将即时生成发票,我想将其作为服务进行推广。这不是一个纯粹的 WebAPI 应用程序。我只想将此 InvoiceController 添加为 WebAPI,并且还有其他 Controller ,例如 HomeController、ProductsController 等...带有 View 和 cshtml。

我得到了单独的 Classic WebForm .Net 应用程序,它将通过 Ajax 调用该 InvoiceGeneration 服务并在网站上显示值。

当我运行我的 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 策略以允许所有类型的请求。
    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 Controller (显然它们在同一个域中。所以,CORS 对他们来说不是问题)。非常混淆。

你们能帮我吗?

附注。此 Html5Rocks教程 js 脚本也不起作用。

在我看来,我认为 JqueryAJAX 脚本没有任何问题。
我得到了另一个纯 WebAPI .Net Core 服务,我设法使用相同的“AllowAll 策略”代码正确设置了 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() 之前。

关于asp.net-web-api - Asp.Net Core WebAPI CORS 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42418892/

相关文章:

c# - .NET Core 单元测试 - 模拟 IOptions<T>

c# - .Net Core HttpClient - 类型化客户端生命周期

Django cors header 和服务器错误

testing - 如何使用 Mule 测试 CORS

c# - C# 中类似 JavaScript 的动态属性

azure - 如何使用 IoC 容器让 ASPNET WebAPI 与 Azure 辅助角色上的 Microsoft.Owin.Host.HttpListener 配合使用?

asp.net - 异步 : return task or await first in asp. 网络 webapi

c# - 字节数组(Web Api 2)到 blob(Angular 客户端)

c# - .Net Core 中的 DbContextTransaction 在哪里

javascript - 从canvas图像获取像素值,CORS限制