簡體   English   中英

Asp.Net核心WebAPI CORS無法正常工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM