Breeze Can';t更新到Microsoft.AspNet.WebApi.OData 5.3.x后,将数据保存到OData controller

Breeze Can';t更新到Microsoft.AspNet.WebApi.OData 5.3.x后,将数据保存到OData controller,breeze,asp.net-web-api-odata,Breeze,Asp.net Web Api Odata,不确定到底是什么发生了更改并导致此部分错误(因为检索数据时不会发生此错误),但在将Microsoft.AspNet.WebApi.OData library更新为5.3.x版本后,breeze在将数据保存到OData controller时遇到问题。它是关于批处理请求的URL的 它也可以通过breeze自己的OData项目样本进行复制 如果查看BatchHandler类的ExecuteRequestMessagesSync方法,则项的RequestUri属性包含OData路由前缀两次 Micr

不确定到底是什么发生了更改并导致此部分错误(因为检索数据时不会发生此错误),但在将Microsoft.AspNet.WebApi.OData library更新为5.3.x版本后,breeze在将数据保存到OData controller时遇到问题。它是关于批处理请求的URL的

它也可以通过breeze自己的OData项目样本进行复制

如果查看BatchHandler类的
ExecuteRequestMessagesSync
方法,则项的
RequestUri
属性包含OData路由前缀两次

Microsoft.AspNet.WebApi.OData库5.2.2 url

http://localhost:55802/odata/TodoItems
Microsoft.AspNet.WebApi.OData库5.3.1 url

http://localhost:55802/odata/odata/TodoItems
有没有办法解决这个问题


微风版:1.5.1

哦,快乐。Microsoft已更改其Web API OData实现。。。再次

感谢您深入了解@coni2k并发现问题

幸运的是,您不必修补微风。我们故意公开了
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;
  };
在我写这篇文章时,我们不确定如何检测您正在使用的Web API OData的哪个版本,这使得我们很难事先确定哪个版本的
getRoutePrefix
适合您的应用程序


希望最终能解决这个问题。不要胆敢将默认设置更改为这个新版本,因为这会破坏所有必须与旧版本的Web API OData对话的现有应用程序。我不知道我们怎样才能赢这场比赛。我们来看看。现在令人沮丧

哦,快乐。Microsoft已更改其Web API OData实现。。。再次

感谢您深入了解@coni2k并发现问题

幸运的是,您不必修补微风。我们故意公开了
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;
  };
在我写这篇文章时,我们不确定如何检测您正在使用的Web API OData的哪个版本,这使得我们很难事先确定哪个版本的
getRoutePrefix
适合您的应用程序


希望最终能解决这个问题。不要胆敢将默认设置更改为这个新版本,因为这会破坏所有必须与旧版本的Web API OData对话的现有应用程序。我不知道我们怎样才能赢这场比赛。我们来看看。现在令人沮丧

沃德,谢谢你的回答。有一个小的打字错误,顺便说一句,函数中有两个括号,应该是;getRoutePrefix531(数据服务)。由于javascript知识有限&有点匆忙,我得出了一个有点误导性的答案。显然,我将更新问题并删除答案,以供参考。谢谢。修正了错误,谢谢你的回答。有一个小的打字错误,顺便说一句,函数中有两个括号,应该是;getRoutePrefix531(数据服务)。由于javascript知识有限&有点匆忙,我得出了一个有点误导性的答案。显然,我将更新问题并删除答案,以供参考。谢谢。修正了打字错误