0

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

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

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

В моей EntityManagerFactory у меня есть OData набор:

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

И в моей DataContext Я зову:

var manager = entityManagerFactory.newManager(); 

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

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

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 

Я также попытался установить эти параметры из файла applicationhost конфигурации 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.

+0

Это выглядит как проблема CORS, а не проблема с Breeze. Я знаю, что вы говорите, что вы включили его (и похоже, что вы это сделали), но вам нужны лучшие доказательства. Один относительно быстрый подход - написать HTML-страницу с тегом скрипта, а внутри этого тега скрипта - вызов JQuery AJAX для конечных точек OData. Напишите на консоль, если она успешно вернется. Затем откройте Dev Tools (F12) и посмотрите, что происходит. – Ward

+0

Попробуйте '$ .ajax ({ type:" GET ", URL:" http: // localhost: 50056/odata/$ metadata "}) .then (function() { alert ("Got data"); }). catch (function (err) {alert ("Failed:" + err.message)}; ' – Ward

+0

Спасибо за ваш ответ! Это работает, но бриз дает мне ошибку «Нет» Access-Control-Allow-Origin 'header присутствует на запрошенном ресурсе ». – socketman

ответ

0

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

var cors = new EnableCorsAttribute("*", "*", "*", "DataServiceVersion, MaxDataServiceVersion"); 
config.EnableCors(cors); 
1

Ahh. В настоящий момент реализация OData в Web Api полна отверстий в горшках ... включая, но не ограничиваясь, отстающую поддержку data.js.

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

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

+0

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

Смежные вопросы