【问题标题】:BreezeJS / C# WebAPI (OData) - Incorrect Resource URLBreezeJS / C# WebAPI (OData) - 资源 URL 不正确
【发布时间】:2015-04-11 13:23:27
【问题描述】:

使用 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 错误。它有服务 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;
}
}]);

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

非常感谢。

【问题讨论】:

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


    【解决方案1】:

    你不应该修补微风!!!

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

    我们知道您提出的问题和https://github.com/Breeze/breeze.js.samples/issues/31 的讨论。我们要为此做点什么……我们只是还没决定到底要做什么。

    但与此同时,您可以应用您喜欢的解决方法无需更改 Breeze。

    这是因为我们将getRoutePrefix 设为“webApiOData”适配器的已发布扩展点

    例如,您几乎可以完全按照@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 实现经历了如此多的混乱和如此多的重大变化,我们一直在努力跟上,直到我们看到稳定性和正确的行为。 inside-the-$batch url 是他们最近破坏的东西之一。它给我们带来了痛苦,但与他们破坏的其他一切相比,这是一个小问题。我们更希望通过 1000 次削减来全面解决死亡问题。

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

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

    【讨论】:

    • 谢谢沃德。这样好多了。
    【解决方案2】:

    看起来这是 Breeze 的一个错误,或者可能是绝对网址与相对网址的意外结果:

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

    基本上,如果你注释掉微风.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 文件。

    【讨论】:

      猜你喜欢
      • 2015-08-11
      • 2012-10-28
      • 2019-04-13
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 2022-08-16
      • 2019-08-10
      • 1970-01-01
      相关资源
      最近更新 更多