Конечные точки CORS на конечных точках asp.net Webforms [WebMethod]

Я пытаюсь добавить некоторые функции аннотированной конечной точки [WebMethod] в веб-приложение стиля Webforms (.aspx и .asmx).

Я хотел бы аннотировать эти конечные точки с помощью [EnableCors] и тем самым получить все хорошие функциональные возможности ajax-preflight.

VS2013 принимает аннотацию, но все же конечные точки не играют хорошо с CORS. (Они отлично работают при использовании одинакового происхождения, но не перекрестного происхождения).

Я даже не могу заставить их работать с перекрестным контуром с пустым и грязным

HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Origin", "*");
Подход

- мои браузеры отклоняют ответы, а заголовки ответов с перекрестным концом не отображаются.

Как я могу получить функциональность CORS в этих конечных точках [WebMethod]?

Ответ 1

Я рекомендую дважды проверять, что вы выполнили все шаги на этой странице: CORS на ASP.NET

В дополнение к:

Response.AppendHeader("Access-Control-Allow-Origin", "*");

Также попробуйте:

Response.AppendHeader("Access-Control-Allow-Methods","*");

/Попробуйте добавить прямо в веб-конфигурацию:

   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Methods" values="*" />
       <add name="Access-Control-Allow-Headers" values="Content-Type" />
     </customHeaders>
   <httpProtocol>

В противном случае вам необходимо обеспечить контроль над обоими доменами.

Ответ 2

Если вам нужен запрос перед полетом, например. поэтому вы можете отправлять аутентифицированные запросы, вы не можете установить Access-Control-Allow-Origin: *. Это должен быть конкретный домен Origin.
Также вы должны установить заголовки ответов Access-Control-Allow-Methods и Access-Control-Allow-Headers, если вы используете что-либо помимо значений по умолчанию.
(Обратите внимание, что эти ограничения - это то, как работает CORS - вот как это определено.)

Итак, недостаточно просто набросить атрибут [EnableCors], вы должны установить значения для параметров:

[EnableCors(origins: "https://www.olliejones.com", headers: "X-Custom-Header", methods: "PUT", SupportsCredentials = true)]

Или если вы хотите делать что-то вручную и явно:

HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Origin", "https://www.olliejones.com");
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Headers", "X-Custom-Header");
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Methods", "PUT");
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Credentials", "true");

Последнее: вам нужно позвонить .EnableCors() при запуске. В частности. MVC или WebAPI, вы бы назвали это на HttpConfiguration, при регистрации конфигурации и тому подобное, однако я понятия не имею, как это работает с WebForms.

Ответ 3

Я думаю, что ваш код выглядит хорошо, но IIS не отправляет объект заголовка только с ожидаемым откликом. Проверьте, правильно ли настроен IIS.

  • Настройка IIS6
  • Настройка IIS7

Если CORS не работает для вашей конкретной проблемы, возможно, jsonp - еще один возможный способ.

Ответ 4

Если вы используете метод AppendHeader для отправки заголовков, специфичных для кеша, и в то же время используйте модель объекта кэша (Cache) для установки политики кэширования, заголовки HTTP-ответов, относящиеся к кешированию, могут быть удалены при использовании модели объекта кэша, Такое поведение позволяет ASP.NET поддерживать самые ограничительные настройки. Например, рассмотрите страницу, содержащую пользовательские элементы управления. Если эти элементы управления имеют конфликтующие политики кэширования, будет использоваться наиболее ограничительная политика кэширования. Если один пользовательский элемент управления устанавливает заголовок "Cache-Control: Public", а другой пользовательский элемент управления устанавливает более ограничительный заголовок "Cache-Control: Private" через вызовы SetCacheability, тогда заголовок "Cache-Control: Private" будет отправлен с ответ.

Вы можете создать httpProtocol в веб-конфигурации для customHeaders.

<httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Methods" values="*" />        
     </customHeaders>
   <httpProtocol>

Ответ 5

Вы можете сделать это в MVC

[EnableCors(origins: "*", headers: "*", methods: "*")]
public ActionResult test()
{
     Response.AppendHeader("Access-Control-Allow-Origin", "*");
     return View();
}

Ответ 6

Для веб-формы вы можете использовать

Response.AddHeader( "Access-Control-Allow-Origin", "*" );

вместо

Response.AppendHeader( "Access-Control-Allow-Origin", "*" );

Первый работает для старой версии веб-формы ASP.Net.