如何将BreezeJS与WCF数据服务交叉使用?

时间:2014-07-18 16:30:35

标签: wcf odata breeze

我正在使用BreezeJS访问我的应用程序中的WCF Odata服务。它在本地计算机上访问服务时效果很好,但是当我尝试在我的开发Web服务器上针对服务运行应用程序时,它会失败。

我做的第一件事就是在服务响应中添加标头以允许跨源请求:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS, MERGE, DELETE, PUT
Access-Control-Allow-Headers: Content-Type, Accept, DataServiceVersion, MaxDataServiceVersion

另外,我将datajs请求设置为使用JSONP:

            var oldClient = OData.defaultHttpClient;
            var myClient = {
                request: function (request, success, error) {
                        request.enableJsonpCallback = true;
                    return oldClient.request(request, success, error);
                },
            };
            OData.defaultHttpClient = myClient;

我的微风设置是:

 breeze.config.initializeAdapterInstance('dataService', 'odata', true);              
 this.dataService = new breeze.DataService({
      serviceName: 'http://mydevserver/AirVision.Web.Site/AvDataService.svc/',
      hasServerMetadata: true,
      useJsonp: true,
 });
 this.manager = new breeze.EntityManager({ dataService: this.dataService });

主要是有效。但是,如果我尝试使用expand():

,它就会爆炸
this.loadSites = function() {
    var query = new breeze.EntityQuery().from("SourceSite")
                  .expand("SourceParameter")
                ;
                return this.manager.executeQuery(query);
            }

我从微风中得到错误:

"TypeError: undefined is not a function
at setNpValue (http://localhost/AirVision.Web.Site/Scripts/breeze.debug.js:5189:41)
at defaultPropertyInterceptor [as _$interceptor] (http://localhost/AirVision.Web.Site/Scripts/breeze.debug.js:4913:13)
at descr.set [as System] (http://localhost/AirVision.Web.Site/Scripts/breeze.debug.js:16161:22)
at protoFn.initializeEntityPrototype.proto.setProperty (http://localhost/AirVision.Web.Site/Scripts/breeze.debug.js:16034:32)
at updateRelatedEntity (http://localhost/AirVision.Web.Site/Scripts/breeze.debug.js:14774:26)
at mergeRelatedEntity (http://localhost/AirVision.Web.Site/Scripts/breeze.debug.js:14715:13)
at http://localhost/AirVision.Web.Site/Scripts/breeze.debug.js:14698:17
at Array.forEach (native)
at updateEntity (http://localhost/AirVision.Web.Site/Scripts/breeze.debug.js:14696:41)
at mergeEntity (http://localhost/AirVision.Web.Site/Scripts/breeze.debug.js:14667:13)"

我已经介入了breeze.debug.js,它归结为这一行:

var siblings = newValue.getProperty(inverseProp.name);

在该行上,newValue对象(表示我的一个数据实体)没有定义getProperty函数。

我是否需要在服务器端或javascript客户端上做些什么来解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

元数据可能无法正确定义您与SourceSite'的关系。到#SourceSrameter'。我在元数据出现问题之前遇到了这个错误,微风无法找到要将数据序列化的实体/关系。 我首先要确保你们之间的关系,以及实体' SourceParameter'就此而言,在服务器端breeze元数据中正确定义。