ASPNetBoilerplate включить CORS

В интерфейсе IApplicationService Я украсил один из моих методов как [HttpOptions]

Когда я делаю ajax из другого домена, метод запускается со стороны сервера, но у меня есть следующее исключение в клиентской части:

Поле заголовка запроса Content-Type не разрешено Access-Control-Allow-Headers в ответе перед проверкой.

В этой ссылке описано, как включить CORS в ядре MVC или WebApi в ASPNetBoilerplate, но у меня нет ни app.UseCors("AllowAll") ни services.AddMvc(); в ASP.Net MVC с ABP.

Я использую https://aspnetboilerplate.com/.

Есть ли способ включить его в ABP?

Образец:

abp.services.fep.user.ping().done(function (data) {
                console.log(data);
            });

но результат:

General
 Request URL:http://xxxx/wado1/api/services/fep/user/Ping
 Request Method:OPTIONS
 Status Code:200 OK
 Remote Address:192.168.16.201:80
 Referrer Policy:no-referrer-when-downgrade
Response Headers:
 Access-Control-Allow-Origin:*
 Cache-Control:private
 Content-Length:129
 Content-Type:application/json; charset=utf-8
 Date:Mon, 12 Feb 2018 10:06:41 GMT
 Server:Microsoft-IIS/10.0
 Set-Cookie:Abp.Localization.CultureName=en-US; expires=Tue, 12-Feb-2019 
 10:06:33 GMT; path=/WADO1
 Set-Cookie:.ASPXANONYMOUS=jE6RBHsyANH3AuPkKFlnusuKGyqfdikCJ5cJSo38xg-
 pCqe8JnUOX3t0o2V6s0_aT3N0PLnw2XG9PRzCPIse3uLC60vS8l-
 3H8Z_UP1lqCIyDunM9oxhxqKJOca1B4Nv5eQwaQ2; expires=Sun, 22-Apr-2018 20:46:33 
 GMT; path=/; HttpOnly
 X-AspNet-Version:4.0.30319
 X-Powered-By:ASP.NET
 X-StackifyID:V1|80000cf1-0001-f700-b63f-84710c7967bb|
Request Headers
 Accept:*/*
 Accept-Encoding:gzip, deflate
 Accept-Language:en-US,en;q=0.9
 Access-Control-Request-Headers:content-type
 Access-Control-Request-Method:POST
 Cache-Control:no-cache
 Connection:keep-alive
 Host:xxxx
 Origin:http://localhost
 Pragma:no-cache
 User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, 
 like Gecko) Chrome/64.0.3282.140 Safari/537.36

Когда я создаю новый шаблон из https://aspnetboilerplate.com/ с работой фрейма ASP.Net Core, я вижу что-то вроде ниже в Startup файл:

// Configure CORS for angular2 UI
services.AddCors(
    options => options.AddPolicy(
        _defaultCorsPolicyName,
        builder => builder
            .WithOrigins(
                // App:CorsOrigins in appsettings.json can contain more than one address separated by comma.
                _appConfiguration["App:CorsOrigins"]
                    .Split(",", StringSplitOptions.RemoveEmptyEntries)
                    .Select(o => o.RemovePostFix("/"))
                    .ToArray()
            )
            .AllowAnyHeader()
            .AllowAnyMethod()
    )
);

ОБНОВЛЕНИЕ 1: я добавляю ниже конфигурацию webapi, чтобы включить CORS:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    { 
        config.EnableCors();  
    }
}

и зарегистрируйте его:

public override void Initialize()
{ 
    WebApiConfig.Register(GlobalConfiguration.Configuration);
}

но на стороне клиента я получил Error 500после включения отслеживания Failed Request я вижу трассировку журнала и ошибку буфера, например:

{"message": "Произошла ошибка.","exceptionMessage":"Существует Ping-действие, определенное для fep/user контроллера api, но с другим HTTP-глаголом. Глаголом запроса является POST. Это должны быть Options","exceptionType":"Abp.AbpException","stackTrace":" at Abp.WebApi.Controllers.Dynamic.Selectors.AbpApiControllerActionSelector.GetActionDescriptorByActionName(HttpControllerContext controllerContext, DynamicApiControlfo) Selectors.AbpApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\r\n в System.Web.Http.Cors.AttributeBasedPolicyProviderFactory.SelectAction(HttpRequestMessage запрос GetCorsPolicyProvider (запрос HttpRequestMessage) \ r \ n в System.Web.Http.Cors.CorsMessageHandler.d__10.MoveNext()\r\n--- Конец трассировки стека из предыдущего местоположения, в котором было сгенерировано исключение ---\r\n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача-задача) \ r \ n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача-задача) \ r \ n в System.Web.Httors.Ch. MoveNext () \ r \ n --- Конец трассировки стека от предыдущего местоположения, где было сгенерировано исключение ---\r\n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Задача) \ r \ n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Задача) \ r \ n в System.Web.Http.Cors.CorsMessageHandler.d__0.MoveNext () "}

UPDATE2:

Я включил CORS:

var cors = new EnableCorsAttribute(
                origins: "*",
                headers: "*",
                methods: "*");
config.EnableCors(cors);

и зарегистрируйте его в application_start но этот Аякс с contentType:application/x-www-form-urlencoded" поскольку @AlperEbicoglu, опубликованный в его методе ответа, запускается в Back-End, но вводит DTO, будет нулевым, потому что это JSON...

Набор abp contentType в application/json автоматически в abp.jquery.js файл, по этой причине (application/json) когда я хочу запустить ниже код:

 abp.services.fep.user.authenticate(box_in).done(function (data) {
                console.log(data);
            }); 

Я получил это упомянутое исключение в разделе UPDATE1.

Почему это можно назвать с application/x-www-form-urlencoded но с application/json Возникло исключение (я вижу это в файле XML Tacer в IIS).

Я думаю, что один шаг остался два, решить эту проблему, любая помощь будет по достоинству оценена.

Заранее спасибо.

2 ответа

Обновил мой ответ.... Вам уже удалось включить CORS. Теперь у вас есть проблема с предполетными запросами. Я думаю, вам нужно украсить свой метод как глагол POST. Браузер автоматически отправляет предварительный запрос, если это необходимо.

и если вы настаиваете на том, чтобы сделать это ВАРИАНТЫ. поэтому вам нужно выполнить его с пользовательским AJAX, как вы можете использовать JQuery AJAX.

что-то вроде этого:

$.ajax({
  url: .....,
  type: 'OPTIONS',
  contentType: "application/x-www-form-urlencoded",
  data: .......,
  success: function (data, status) {
    console.log("Success!!");
    console.log(data);
    console.log(status);
  },
  error: function (xhr, desc, err) {
    console.log(xhr);
    console.log("Desc: " + desc + "\nErr:" + err);
  }
});

Пожалуйста, прочитайте это: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

В прошлый раз у меня было подобное требование с abp, я обратился к нему с помощью пользовательского атрибута вместо метода enablecors, как показано ниже:

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext filterContext)
    {
        if (filterContext.Response != null)
            if (filterContext.Response.Headers != null)
                filterContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");
        base.OnActionExecuted(filterContext);
    }
}

а затем в WebApiModule:

Configuration.Modules.AbpWebApi().DynamicApiControllerBuilder
            .ForAll<IApplicationService>(typeof(WebsiteApplicationModule).Assembly, "api")
            .WithConventionalVerbs()
            .WithFilters(new AllowCrossSiteJsonAttribute())
            .Build();

если вы все еще получаете сообщение об ошибках Access-Control-Allow-Headers, попробуйте добавить его также в заголовки ответа

на основе этого потока: Настройка Access-Control-Allow-Origin в ASP.Net MVC - самый простой способ

Другие вопросы по тегам