Не удается сохранить данные в контроллер OData после обновления до Microsoft.AspNet.WebApi.OData 5.3.x

Не уверен, что именно изменилось и вызвало эту частичную ошибку (поскольку это не происходит при извлечении данных), но после обновления библиотеки Microsoft.AspNet.WebApi.OData до версии 5.3.x у бриза возникла проблема с сохранением данных в контроллер OData. Речь идет об URL-адресах пакетных запросов.

Его также можно воспроизвести с помощью собственного примера проекта OData breeze;
http://www.breezejs.com/samples/breeze-web-api-odata

Если вы посмотрите на метод ExecuteRequestMessagesAsync класса BatchHandler, свойство RequestUri элементов содержит префикс маршрута OData два раза.

URL-адрес библиотеки Microsoft.AspNet.WebApi.OData 5.2.2

http://localhost:55802/odata/TodoItems

URL-адрес библиотеки Microsoft.AspNet.WebApi.OData 5.3.1

http://localhost:55802/odata/odata/TodoItems

Любые идеи, как решить эту проблему?

бриз версия: 1.5.1


person coni2k    schedule 24.10.2014    source источник


Ответы (1)


О радость. Microsoft снова изменила свою реализацию OData веб-API

Спасибо, что покопались, @coni2k, и определили проблему.

К счастью, вам НЕ нужно исправлять Breeze. Мы преднамеренно раскрываем метод getRoutePrefix, чтобы вы могли изменить его самостоятельно в соответствии со своими потребностями.

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

var adapter = breeze.config.getAdapterInstance('dataservice', 'webApiOdata');
adapter.getRoutePrefix = getRoutePrefix531; // plug-in alternative for THIS adapter instance.

function getRoutePrefix531(dataService) {
    // Copied from breeze.debug and modified for Web API OData v.5.3.1.
    if (typeof document === 'object') { // browser
      var parser = document.createElement('a');
      parser.href = dataService.serviceName;
    } else { // node
      parser = url.parse(dataService.serviceName);
    }
    // THE CHANGE FOR 5.3.1: Add '/' prefix to pathname
    var prefix = parser.pathname;
    if (prefix[0] !== '/') {
        prefix = '/' + prefix;
    } // add leading '/'  (only in IE)
    if (prefix.substr(-1) !== '/') {
        prefix += '/';
    } // ensure trailing '/'
    return prefix;
  };

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

Надеюсь разобраться в этом в конце концов. Не смейте менять значение по умолчанию на эту новую версию, потому что это нарушит работу любого существующего приложения, которое должно взаимодействовать со старой версией OData веб-API. Не знаю, как мы можем выиграть эту игру. Мы посмотрим на это. Разочаровывает пока.

person Ward    schedule 28.10.2014
comment
Уорд, спасибо за ответ. Между прочим, есть одна небольшая опечатка, в функции две скобки, должно быть; getRoutePrefix531 (служба данных). С ограниченными знаниями javascript и небольшой спешкой я, по-видимому, придумал немного вводящий в заблуждение ответ, я собираюсь обновить вопрос и удалить ответ для вашей информации. - person coni2k; 29.10.2014
comment
Спасибо. Исправлена ​​опечатка - person Ward; 29.10.2014