BreezeJS / C#WebAPI(OData) - 资源URL不正确

时间:2015-02-11 08:39:24

标签: .net angularjs odata breeze asp.net-web-api

使用BreezeJS / Angular / WebAPI(OData),我已经设置了一个项目,我可以通过以下方式调用GET:

    breeze.EntityQuery
          .from(resource)
          .using(manager)
          .execute()
          .then(function (data) {
              deferred.resolve(data.results);
          });

但是,当我尝试使用以下命令保存更改或创建新实体时

    var type = manager.metadataStore.getEntityType(model);
    type.setProperties({
        autoGeneratedKeyType: breeze.AutoGeneratedKeyType.KeyGenerator
    });
    var newM = manager.createEntity(type, m);
    manager.saveChanges().then(function () { alert('success'); }, function (error) { prompt("", JSON.stringify(error)); });

我收到错误:

“找不到与请求URI'http://localhost:57508/odata/odata/Models'”匹配的HTTP资源

这很奇怪,因为URL错误。它有服务网址和额外的'odata'。

我的AngularJS工厂非常简单:

app.factory("EntityManagerFactory", ['breeze', function (breeze) {
    configureBreeze();
    var serviceRoot = window.location.protocol + '//' + window.location.host + '/';
    var serviceName = serviceRoot + 'odata/';
    var factory = {
        manager: newManager,
        serviceName: serviceName,
        metadataStore: {}
    };

    return factory;

function configureBreeze() {
    // use Web API OData to query and save
    breeze.config.initializeAdapterInstance('dataService', 'webApiOData', true);

    // convert between server-side PascalCase and client-side camelCase
    // breeze.NamingConvention.camelCase.setAsDefault();
}

function newManager() {
    var mgr = new breeze.EntityManager(serviceName);

    mgr.fetchMetadata().then(function () {
        //var modelType = manager.metadataStore;
    });
    return mgr;
}
}]);

我不确定在哪里可以查找添加到生成的网址的额外“odata”。从serviceName中删除'odata'会阻止GET正常工作。

非常感谢。

2 个答案:

答案 0 :(得分:1)

你不应该打破BREEZE !!!

没有必要解决这个问题,并且修补微风会使我们升级的能力变得更加复杂,因为我们每隔2或3周发布一次新版本。

我们知道您提出的问题和https://github.com/Breeze/breeze.js.samples/issues/31的讨论。我们将对此采取一些措施......我们还没有确定我们将做些什么。

但与此同时,您可以应用首选的解决方法而不更改Breeze。

那是因为我们为“webApiOData”适配器制作了getRoutePrefix 已发布的扩展点

例如,您可以像@ user2908937建议的那样完成,而无需更改Breeze源代码行。

只需在应用程序设置逻辑中覆盖该扩展方法......就像这样。

function configureBreeze() {

    // choose and get the Web API OData DataServiceAdapter
    var adapter = breeze.config.initializeAdapterInstance(
                  'dataService', 'webApiOData', true);

    // override the getRoutePrefix instance method
    adapter.getRoutePrefix = function (dataService) {
        return "";
    };

    // ... more configuration ...
}

这不是黑客行为。这正是我们暴露这种方法的原因。

为什么我们不解决它?

好问题。

ASP.NET Web API OData实现经历了如此多的流失和许多重大变化,我们一直在努力跟上,直到我们看到稳定性和正确的行为。 $ $批量内部网址是他们最近破解的内容之一。这会让我们感到痛苦,但与其他所有破坏的东西相比,这是一个很小的问题。我们更倾向于通过1000次削减来全面解决死亡问题。

最近与MS团队的对话令人鼓舞。我们打算尽快再次同步。

与此同时,您可以按照我在此建议的方式处理这个特定问题。

答案 1 :(得分:0)

看起来这是Breeze的一个错误,也许是绝对与相对网址的意外后果:

https://github.com/Breeze/breeze.js.samples/issues/31

基本上,如果你在breeze.debug.js中的第16573-16575行注释掉代码:

if (prefix[0] === '/') {
  prefix = prefix.substr(1);
} // drop leading '/'  (all but IE)

这只能修复Chrome / Firefox。为了解决所有问题,我只是在函数的开头返回一个空字符串:

webApiODataCtor.prototype.getRoutePrefix = function (dataService) {
  return "";
  // Removed Code
};

那就像魅力一样。猜猜我会让.NET缩小js文件。