查询DOES返回数据时出现奇怪的微风错误(更新:元数据未正确加载)

时间:2013-12-12 17:24:16

标签: exception odata breeze

我正在使用ODataController将数据返回到breeze dataservice,这是dataservice

app.dataservice = (function (breeze) {    
    breeze.config.initializeAdapterInstances({ dataService: "OData" });

    var manager = new breeze.EntityManager('/api/v1/');

    return {
        getRecipePage: getRecipePage
    };

    function getRecipePage(skip, take, searchText) {
        var query = breeze.EntityQuery
                .from("Recipes")
                .orderBy("Name")
                .skip(skip).take(take)
                .inlineCount(true);
        if (searchText) {
            query = query.where("Name", "contains", searchText);
        }

        return manager.executeQuery(query);
    }
})(breeze);

在我的控制器中调用getRecipePage函数时,它似乎正确地返回数据,但异常是奇怪的

getDataFunction(skip, take)
        .then(function (largeLoad) {
            $scope.setPagedData(largeLoad, currentPage, pageSize);
        })
        .fail(function (e) {
            debugger;
        });

e变量的消息为"; ",这没有任何意义。状态为“200 OK”,这很好。

正文包含我的两个实体,并且网址代码更正“/ api / v1 / Recipes?$ orderby = Name&amp; $ top = 2&amp; $ inlinecount = allpages”,如果我导航到它,json看起来很好:< / p>

{
    "$id": "1",
    "$type": "Breeze.WebApi2.QueryResult, Breeze.WebApi2",
    "Results": [
        {
            "$id": "2",
            "$type": "RecipeBook.Web.Angular.Models.RecipeBook.Recipe, RecipeBook.Web.Angular",
            "Name": "1 Boiled Water",
            "Description": "6 Steamy goodness!",
            "Id": 1
        },
        {
            "$id": "3",
            "$type": "RecipeBook.Web.Angular.Models.RecipeBook.Recipe, RecipeBook.Web.Angular",
            "Name": "2 Hot Chocolate",
            "Description": "5 Chocolatey Chocolateness!",
            "Id": 2
        }
    ],
    "InlineCount": 6
}

......这个错误是什么?最后,这是堆栈:

Error
    at createError (http://localhost:62576/Scripts/breeze.debug.js:15182:22)
    at http://localhost:62576/Scripts/breeze.debug.js:14971:40
    at http://localhost:62576/Scripts/datajs-1.1.1.js:1671:17
    at XMLHttpRequest.odata.defaultHttpClient.request.xhr.onreadystatechange (http://localhost:62576/Scripts/datajs-1.1.1.js:2587:25)

关于发生了什么的想法???

修改 经过大量的挖掘,我有点缩小了与读取响应的处理程序相关的问题。在datajs-1.1.1.js~line 8100中,有一个dispatchHandler函数。我有一个从OData调用回来的requestOrResponse:

它有一个带有上述json文本的body属性。但是,数据属性是未定义的,但我认为它正在尝试将主体转换为...并且正在寻找处理程序来执行此操作。它的statusCode是200,statusText是OK。但是该方法找不到合适的处理程序并抛出:

  throw { message: "no handler for data" };

......这似乎是错误的起源。我不知道什么设置不正确,以便我可以纠正这种情况。

EDIT2: 它可能实际上是因为没有正确解析元数据(xml)...,这就是它的样子(在调试时取自datajs handlerRead函数)

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
  <edmx:DataServices m:DataServiceVersion="3.0" m:MaxDataServiceVersion="3.0" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
    <Schema Namespace="RecipeBook.Web.Angular.Models.Recipe" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
      <EntityType Name="Recipe">
        <Key>
          <PropertyRef Name="Id" />
        </Key>
        <Property Name="Id" Type="Edm.Int32" Nullable="false" />
        <Property Name="Name" Type="Edm.String" />
        <Property Name="Description" Type="Edm.String" />
        <Property Name="Steps" Type="Collection(Edm.String)" />
        <NavigationProperty Name="Ingredients" Relationship="RecipeBook.Web.Angular.Models.Recipe.RecipeBook_Web_Angular_Models_Recipe_Recipe_Ingredients_RecipeBook_Web_Angular_Models_Recipe_RecipeIngredient_IngredientsPartner" ToRole="Ingredients" FromRole="IngredientsPartner" />
      </EntityType>
      <EntityType Name="RecipeIngredient">
        <Key>
          <PropertyRef Name="Id" />
        </Key>
        <Property Name="Id" Type="Edm.Int32" Nullable="false" />
        <Property Name="IngredientId" Type="Edm.Int32" Nullable="false" />
        <Property Name="Quantity" Type="Edm.Int32" Nullable="false" />
        <Property Name="UnitOfMeasureId" Type="Edm.Int32" Nullable="false" />
        <Property Name="Notes" Type="Edm.String" />
      </EntityType>
      <Association Name="RecipeBook_Web_Angular_Models_Recipe_Recipe_Ingredients_RecipeBook_Web_Angular_Models_Recipe_RecipeIngredient_IngredientsPartner">
        <End Type="RecipeBook.Web.Angular.Models.Recipe.RecipeIngredient" Role="Ingredients" Multiplicity="*" />
        <End Type="RecipeBook.Web.Angular.Models.Recipe.Recipe" Role="IngredientsPartner" Multiplicity="0..1" />
      </Association>
      <EntityContainer Name="Container" m:IsDefaultEntityContainer="true">
        <EntitySet Name="Recipes" EntityType="RecipeBook.Web.Angular.Models.Recipe.Recipe" />
      </EntityContainer>
    </Schema>
  </edmx:DataServices>
</edmx:Edmx>

EDIT3:

...所以,如果我使用OData,作为我的dataService,我需要在$ metadata找到json元数据。如果我使用WebAPI,它会在/ Metadata中查找元数据,这可以是Edmx或json。但是,我的元数据在$ metadata中以Edmx的形式返回...这是不支持的一件事吗?

http://www.breezejs.com/documentation/breeze-metadata-details

我准备抛弃所有这些(棱角分明,微风,odata),然后按照旧方式去做。

Edit4: 这不是一个修复,但如果我关闭元数据它“工作”...所以我的问题肯定与元数据无法正确加载有关。

var dataService = new breeze.DataService({
    serviceName: "/api/v1/",
    hasServerMetadata: false 
});

1 个答案:

答案 0 :(得分:1)

看起来您正在使用Web API。考虑您可以使用[BreezeController]属性修饰控制器,而不是指定OData,您可以使用webApi来扩展配置。值得一试。

此外,您可能需要配置Breeze适配器以使用与Angular配对良好的backingStore。 - http://www.breezejs.com/samples/todo-dataservice(此链接提供了一些有用的提示,可指导您设置Breeze以便与Angular配合使用)

最后,请记住,第一次使用它时设置任何库似乎总是比实际更困难。一旦你配置它,你几乎再也不会触摸配置,而是Breeze 只是工作,真的很棒。

修改

检查此链接,该链接在Breeze,Angular,OData和Web API上进行了简要的漫游 - http://sravi-kiran.blogspot.com/2013/11/UsingBreezeJsToConsumeAspNetWebApiODataInAnAngularJsApplication.html

另一个好处'我怎么......'在这里回答沃德 -

How to consume OData service with Html/Javascript?