我第一次为WCF数据服务创建代理时,代码生成器(Visual Studio 2010 SP1)将实体类型定义放在:
MyClient.DBService.DBModel
来自该服务的OData源看起来像这样:
<element p2:type="DBModel.GetWorkstationProfile_Result">
此版本的服务仅公开服务操作,而不是实体集。对项目的前半部分感到满意,然后我开始提供一些实体集,因此我在数据服务中为它们添加了一些访问规则,如下所示:
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("FooBars", EntitySetRights.AllRead);
config.SetServiceOperationAccessRule("GetWorkstationProfile", ServiceOperationRights.All);
我在客户端上执行了“更新服务引用”,但现在代理将所有内容放入
MyClient.DBService
包括服务操作返回的复杂类型,以及过去的MyClient.DBService.DBModel
。
但是,数据服务仍然将返回元素的类型设置为DBModel.GetWorkstationProfile_Result
,因此对象永远不会被反序列化。每次调用都会产生一个空列表,即使我可以在浏览器中查看相同的查询,并且看到来自该服务的OData就好了。
我可以通过在数据服务的SetEntityAccessRule
方法中启用或禁用InitializeService
来使代理代码生成器返回。已禁用 - 一切都在MyClient.DBService.DBModel
;已启用 - 所有内容都在MyClient.DBService
。
这是WCF数据服务中的错误吗?如何说服代理代码生成器使用其原始命名空间,或让数据服务在新命名空间中传递元素?
答案 0 :(得分:0)
您是否在导致新命名空间的服务器上进行了更改?
您可以尝试删除代理并从头开始创建。
修改强>
尝试:
config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);