2012-02-25 64 views
1

我一直在为这一天挣扎几天,并认为我已经把问题隔离到序列化问题。返回一个复杂类型的WCF数据服务不是ATOM格式

我有一个WCF数据服务,我正在调用一个存储过程,拉入数据集(n行)。数据服务使用功能导入并返回一个复杂类型。该服务工作正常,返回在浏览器中执行以下操作:

< GetChanges的xmlns = “http://schemas.microsoft.com/ado/2007/08/dataservices” >
<元素的xmlns:P2 =“HTTP ://schemas.microsoft.com/ado/2007/08/dataservices/metadata” P2:类型= “tasksModel.fxGetChangeList_Result” >

<CHANGE> DELETE </CHANGE >

< ID P2:类型=“Edm.Int32”/ID >

< UpdateVersion P2:类型= “Edm.Int64”/UpdateVersion >

< /元件>

</GetChanges >

但是,当我从客户端(Windows Phone应用程序)调用此数据不会返回任何结果。我已经证实,该网址直接拉下了上面的数据。

这里是客户端调用...

_changes.LoadCompleted += new EventHandler<System.Data.Services.Client.LoadCompletedEventArgs>(Items_LoadCompleted); 

_changes.LoadAsync(new Uri(theUrl, UriKind.Absolute)); 

这里是回调

void Items_LoadCompleted(object sender, System.Data.Services.Client.LoadCompletedEventArgs e) 
    { 
     int count = _changes.Count; 
     _changes.ToList().ForEach(x=>{ 
     .... 
    }); 

不会引发任何错误根本不返回任何结果。

我已经意识到上述来自数据服务的XML不是原子格式。我唯一能想到的是客户端不能序列化复杂类型的数据,因为它不是Atom格式。

所以我有3个问题: 1.有没有其他人遇到过这个? 2.是否有客户端解决方案来序列化复杂类型? 3.是否有服务器端的解决方案将复杂的序列化为Atom?

回答

0

1)这是客户端库的已知限制。

2)目前不支持客户端库。通常的解决方法是从服务器返回实体类型或自己解析响应(通常使用XLinq)

3)复杂类型没有ATOM格式。要获得ATOM,服务器需要返回一个实体类型。

+0

非常感谢。我会花更多的时间尝试调试。总的来说,我发现不得不学习客户行为,并且遵守大部分协议都比努力付出更多的努力。我用几个小时替代编写了几个小时的调试代码。 我认为对于我的大部分用例来说,我最好只用WebHttpBindings公开一个非数据服务WCF服务,并以这种方式公开我的对象。我获得了对有效载荷大小的更多控制,并更多地控制了实际发送的对象。 我的主要用途是将SQL Azure数据公开给Web和移动客户端。我可以忽略一些东西吗 – frigon 2012-02-27 16:51:19

+0

这很大程度上取决于您的要求。 OData(WCF DS)非常棒,如果您需要客户提出您不了解的问题的能力。如果您知道客户提出的问题,您可以在非OData WCF服务中这样做。另一方面,在OData中,在某些情况下很难实现某些特定的业务逻辑,WCF通常更容易。因此,如果您只想将您的服务绑定到客户端,并且您同时控制两者,并且可以在服务器上对查询进行硬编码,那么普通的WCF服务将起作用。如果你需要客户的一些自由,你会想要OData。 – 2012-02-28 12:01:56

相关问题