0

不确定到底发生了什么变化并导致了这个部分错误(因为它没有在检索数据时发生)但是在将 Microsoft.AspNet.WebApi.OData 库更新到 5.3.x 版本后,微风在将数据保存到 OData 控制器时出现问题。这是关于批处理请求的网址。

也可以用微风自带的示例OData项目复现;
http://www.breezejs.com/samples/breeze-web-api-odata

如果您查看ExecuteRequestMessagesAsyncBatchHandler 类的方法,RequestUri项目的属性包含两次 OData 路由前缀。

Microsoft.AspNet.WebApi.OData 库 5.2.2 网址

http://localhost:55802/odata/TodoItems

Microsoft.AspNet.WebApi.OData 库 5.3.1 网址

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

任何想法如何解决这个问题?

微风版本:1.5.1

4

1 回答 1

4

哦快乐。微软已经改变了他们的 Web API OData 实现......再次

感谢@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;
  };

在我撰写本文时,我们不确定如何检测您正在使用的 Web API OData 版本,这使得我们很难先验地判断哪个版本getRoutePrefix适合您的应用程序。

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

于 2014-10-28T18:26:13.983 回答