Метод OData веб-API Breezejs не разрешен

Я получаю сообщение об ошибке 400, 404 или 405 при попытке запросить мою службу OData веб-API.

Мое имя удаленной службы настроено на:

var remoteServiceName = 'http://localhost:50056/odata/';

В моем entityManagerFactory у меня есть набор Odata:

breeze.config.initializeAdapterInstance('dataService', 'webApiOData', true);

И в моем контексте данных я звоню:

var manager = entityManagerFactory.newManager();

    return breeze.EntityQuery.from('Courses')
            .using(manager).execute()
            .then(success).catch(failed);

В настоящее время я получаю сообщение об ошибке:

XMLHttpRequest cannot load http://localhost:50056/odata/$metadata. No 'Access-Control-Allow-Origin' header is present on the requested resource

Я могу получить доступ к этому пути в браузере. Я нашел несколько ресурсов, предлагающих установить httpProtocol в моем файле web.config следующим образом:

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="*" />
  </customHeaders>
</httpProtocol>

Но это просто дает мне

XMLHttpRequest cannot load http://localhost:50056/odata/$metadata. The 'Access-Control-Allow-Origin' header contains multiple values

Я также пытался установить эти параметры из конфигурационного файла приложения IIS Express, но это дает мне следующее:

Invalid HTTP status code 400

Я также слышал, что добавление следующего параметра в WebApiConfig должно работать:

config.EnableCors();

Но я не вижу эффекта, и в качестве альтернативы я пробовал:

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

Что тоже не влияет. Я не вижу, что еще я мог упустить, поскольку я исчерпал все ресурсы, которые нашел в Интернете.

Я использую Visual Studio 2013 Express и IIS Express.


person socketman    schedule 22.11.2014    source источник
comment
Это похоже на проблему CORS, а не на проблему Breeze. Я знаю, вы говорите, что включили его (и похоже, что вы это сделали), но вам нужно больше доказательств. Одним из относительно быстрых подходов является написание HTML-страницы с тегом script, а внутри этого тега script находится вызов jQuery AJAX к конечным точкам OData. Напишите в консоль, если он успешно вернется. Затем откройте Dev Tools (F12) и посмотрите, что происходит.   -  person Ward    schedule 23.11.2014
comment
Попробуйте $.ajax({ type: "GET", url: "http://localhost:50056/odata/$metadata" }) .then(function() { alert( "Got data" ); }).catch(function(err) {alert("Failed: "+err.message)});   -  person Ward    schedule 23.11.2014
comment
Спасибо за ваш ответ! Это работает, но ветер выдает ошибку. В запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».   -  person socketman    schedule 23.11.2014
comment
@Ward Кажется, что jquery учитывает, когда я устанавливаю config.EnableCors(new EnableCorsAttribute(origins: localhost:50063, ,)); но угловой/бриз в этом случае нет   -  person socketman    schedule 23.11.2014
comment
Я не знаю, означает ли это что-нибудь, но похоже, что два запроса OPTIONS успешно отправлены в метаданные, но два запроса GET не выполняются   -  person socketman    schedule 23.11.2014


Ответы (2)


Ах. На данный момент реализация OData в веб-API полна дыр... включая, помимо прочего, отстающую поддержку data.js.

Я на связи с командой OData и надеюсь, что мы скоро добьемся прогресса.

Вам действительно нужен OData? Если вам не нужно поддерживать открытые клиенты, гораздо лучше использовать прямое веб-API.

person Ward    schedule 23.11.2014
comment
Наши проблемы были связаны с реализацией OData веб-API. Ты смущаешь меня. Ваш вопрос начинается со ссылки на Web Api OData. Теперь вы говорите о Java. Что касается клиента, то наш набор данных oob опирается на возможности datajs. FWIF, поэтому ваша настройка CORS на jQuery не повлияла; datajs делает свой собственный XHR. Обычно нет необходимости включать CORS в браузере... если только вы не работаете со старым браузером. Ему нужно больше знать о вашем сервере и целевых браузерах, чтобы быть более полезным. - person Ward; 24.11.2014

Я нашел свою проблему. Я использовал OData v4. Судя по всему, datajs еще не поддерживает OData v4. Добавление следующего кода в WebApiConfig еще больше упростило ситуацию:

var cors = new EnableCorsAttribute("*", "*", "*", "DataServiceVersion, MaxDataServiceVersion");
config.EnableCors(cors);
person socketman    schedule 23.11.2014