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 - самый простой способ