Заголовок "Access-Control-Allow-Origin" содержит несколько значений
Я использую AngularJS $http на стороне клиента для доступа к конечной точке a ASP.NET приложение Web API на стороне сервера. Поскольку клиент размещен на другом домене в качестве сервера, Мне нужен CORS. Он работает за $ http.сообщение (url, данные). Но как только я проверить подлинность пользователя и сделать запрос через $протоколу HTTP.get (url), я получаю сообщение
The 'Access-Control-Allow-Origin' header contains multiple values 'http://127.0.0.1:9000, http://127.0.0.1:9000', but only one is allowed. Origin 'http://127.0.0.1:9000' is therefore not allowed access.
Fiddler показывает мне, что в запросе get действительно есть две записи заголовка после успешного запроса опций. Что и где я делаешь что-то не так?
обновление
когда я использую jQuery $.получить вместо $ http.вам, появляется то же сообщение об ошибке. Так что это, кажется, не проблема с AngularJS. Но где же это неправильно?
11 ответов:
добавил
config.EnableCors(new EnableCorsAttribute(Properties.Settings.Default.Cors, "", ""))а также
app.UseCors(CorsOptions.AllowAll);на сервере. Это приводит к двум записям заголовка. Просто используйте последний, и он работает.
мы столкнулись с этой проблемой, потому что мы создали CORS в соответствии с лучшей практикой (например http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api) а также имел пользовательский заголовок
<add name="Access-Control-Allow-Origin" value="*"/>в интернете.конфиг.удалить веб.конфиг-запись, и все хорошо.
вопреки ответу @mww, у нас все еще есть
EnableCors()в WebApiConfig.cs и anEnableCorsAttributeна контроллере. Когда мы вытащили одного или другого, мы столкнулись с другим проблемы.
Я использую Cors 5.1.0.0, после большой головной боли, я обнаружил, что проблема дублируется Доступ-контроля-разрешить-происхождения и доступ-контроля-разрешить-заголовки заголовки с сервера
удалены
config.EnableCors()из WebApiConfig.cs-файл и просто установите[EnableCors("*","*","*")]атрибут класса контроллераРегистрация в этой статье подробнее.
у меня тоже были как OWIN, так и мой WebAPI, который, по-видимому, нуждался в CORS, включенном отдельно, что, в свою очередь, создало
'Access-Control-Allow-Origin' header contains multiple valuesошибка.Я закончил тем, что удалил весь код, который включил CORS, а затем добавил следующее в
system.webServerузел моей сети.Config:<httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="https://stethio.azurewebsites.net" /> <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" /> <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization" /> </customHeaders> </httpProtocol>выполнение этого удовлетворяло требованиям CORS для OWIN (разрешение входа в систему) и для WebAPI (разрешение вызовов API), но это создало новую проблему: an
OPTIONSметод не может быть найден во время предполетной подготовки для моего вызов API. Исправить это было просто-мне просто нужно было удалить следующее изhandlersмой веб-узел.Config:<remove name="OPTIONSVerbHandler" />надеюсь, это кому-то поможет.
на самом деле вы не можете установить несколько заголовков
Access-Control-Allow-Origin(или, по крайней мере, он не будет работать во всех браузерах). Вместо этого вы можете условно установить переменную среды, а затем использовать ее в
Сервер Apache:
Я трачу то же самое, но это было потому, что у меня не было кавычек (") Звездочка в моем файле, который обеспечивал доступ к серверу, например '.htaccess.":
Header add Access-Control-Allow-Origin: * Header add Access-Control-Allow-Origin "*"у вас также может быть файл '.htaccess в папку с другим '.htaccess ' out, например
/ - .htaccess - public_html / .htaccess (problem here)в вашем случае вместо звездочки '*' будет ip (
http://127.0.0.1:9000) сервер, которому вы даете разрешение на обслуживание данные.ASP.NET:
убедитесь, что в вашем коде нет дубликата "Access-Control-Allow-Origin".
Разработчик:
С помощью Chrome вы можете проверить заголовки запросов. Нажмите клавишу F12 и перейдите на вкладку "Сеть", теперь запустите запрос AJAX и появится в списке, нажмите и дайте всю информацию там.
это происходит, когда у вас есть опция Cors, настроенная в нескольких местах. В моем случае у меня это было на уровне контроллера, а также при запуске.Автор.cs / ConfigureAuth.
Я понимаю, что если вы хотите, чтобы это приложение было широким, то просто настройте его при запуске.Автор.cs / ConfigureAuth вот так...Вам понадобится ссылка на Microsoft.Долг.Корс
public void ConfigureAuth(IAppBuilder app) { app.UseCors(CorsOptions.AllowAll);Если вы предпочитаете держать его на уровне контроллера, то вы можете просто вставить в контроллер уровень.
[EnableCors("http://localhost:24589", "*", "*")] public class ProductsController : ApiController { ProductRepository _prodRepo;
Если вы находитесь в IIS, вам нужно активировать CORS в интернете.config, то вам не нужно включать в App_Start/WebApiConfig.метод регистра cs
мое решение было, прокомментировать строки:
// Enable CORS //EnableCorsAttribute cors = new EnableCorsAttribute("*", "*", "*"); //config.EnableCors(cors);и пишем в интернете.config:
<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> </customHeaders> </httpProtocol>
просто была эта проблема с сервером nodejs.
вот как я это исправил.
я запускаю свой сервер узлов черезnginx proxyи я установил nginx иnodeкакallow cross domain requestsи ему это не понравилось, поэтому я удалил его из nginx и оставил его в узле, и все было хорошо.
Это также может случиться, конечно, если вы на самом деле установить
Access-Control-Allow-Originзаголовок, чтобы иметь несколько значений - например, разделенный запятыми список значений, который является вид поддерживается в RFC но на самом деле не поддерживается большинством основных браузерах. Обратите внимание, что RFC говорит о том, как разрешить более одного домена без использования '*' а также.например, вы можете получить эту ошибку в Chrome с помощью заголовка как Итак:
Access-Control-Allow-Origin: http://test.mysite.com, http://test2.mysite.comЭто было
Chrome Version 64.0.3282.186 (Official Build) (64-bit)обратите внимание, что если вы рассматриваете это из-за CDN, и вы используете Akamai, вы можете отметить, что Akamai не будет кэшировать на сервере, если вы используете
Vary:Origin, кстати многие предлагают решить эту проблему.вам, вероятно, придется изменить способ построения ключа кэша, используя поведение ответа "изменение идентификатора кэша". Еще подробности по этому вопросу в этом связанном StackOverflow вопрос
я столкнулся с той же проблемой, и это то, что я сделал, чтобы решить ее:
в службе WebApi, внутри Global.asax я написал следующий код:
Sub Application_BeginRequest() Dim currentRequest = HttpContext.Current.Request Dim currentResponse = HttpContext.Current.Response Dim currentOriginValue As String = String.Empty Dim currentHostValue As String = String.Empty Dim currentRequestOrigin = currentRequest.Headers("Origin") Dim currentRequestHost = currentRequest.Headers("Host") Dim currentRequestHeaders = currentRequest.Headers("Access-Control-Request-Headers") Dim currentRequestMethod = currentRequest.Headers("Access-Control-Request-Method") If currentRequestOrigin IsNot Nothing Then currentOriginValue = currentRequestOrigin End If If currentRequest.Path.ToLower().IndexOf("token") > -1 Or Request.HttpMethod = "OPTIONS" Then currentResponse.Headers.Remove("Access-Control-Allow-Origin") currentResponse.AppendHeader("Access-Control-Allow-Origin", "*") End If For Each key In Request.Headers.AllKeys If key = "Origin" AndAlso Request.HttpMethod = "OPTIONS" Then currentResponse.AppendHeader("Access-Control-Allow-Credentials", "true") currentResponse.AppendHeader("Access-Control-Allow-Methods", currentRequestMethod) currentResponse.AppendHeader("Access-Control-Allow-Headers", If(currentRequestHeaders, "GET,POST,PUT,DELETE,OPTIONS")) currentResponse.StatusCode = 200 currentResponse.End() End If Next End Subздесь этот код позволяет только предполетный и маркерный запрос добавить "Access-Control-Allow-Origin" в ответ, иначе я его не добавляю.
вот мой блог о выполнении: https://ibhowmick.wordpress.com/2018/09/21/cross-domain-token-based-authentication-with-web-api2-and-jquery-angular-5-angular-6/

Comments