我有一个非常简单的WCF服务方法,它返回一个IQueryable,仅用于测试。也许我在试图了解IQueryable的设计时遇到了什么问题。我明确计划稍后将其与NHibernate的IQueryable提供程序一起使用。但是,每当使用返回IQueryable的WCF方法时,我首先遇到某种序列化问题(至少我认为这可能是问题)。它甚至不适用于简单的字符串。
这是我的代码:
public IQueryable<string> GetEquipmentConfigurations()
{
var returnValue = new List<string>();
returnValue.Add("test");
return returnValue.AsQueryable();
}
它可能没什么意义,它只是用于测试我是否真的通过使用WCF的线路获得了这些IQueryables。每当我使用类似SoapUI的客户端调用此方法时,我会收到套接字异常和连接重置,就像我尝试返回未标记为DataContract的内容一样。但我在这里唯一要做的就是尝试返回一些糟糕的字符串列表。这有什么问题?
我使用basicHTTPBinding,这是我的设置:
<system.serviceModel>
<services>
<service name="EquipmentConfigurationService" behaviorConfiguration="DefaultBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/Krones.KBase/Services/EquipmentConfigurationService"/>
</baseAddresses>
</host>
<endpoint address=""
binding="basicHttpBinding"
contract="Krones.MES.KBase.Public.Service.EquipmentDefinition.IEquipmentConfigurationService" />
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="DefaultBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
为界面设置了OperationContract属性:
[OperationContract]
IQueryable<string> GetEquipmentConfigurations();
只返回一个简单的字符串就可以了。无论如何,我想稍后使用LINQ从IQueryable功能中获利。
有人知道这里出了什么问题吗?
谢谢和干杯,
的Stefan
答案 0 :(得分:10)
核心WCF旨在发送数据,而不是查询。坚持回归List<Foo>
等;它会让你头疼不已。
但是,您可以通过WCF Data Services做更多的运气,这可以让您公开IQueryable<>
来源。
这种方法的工作方式是工具构建一个客户端,公开类似的 IQueryable<>
钩子;当您查询数据时,它表示线上的表达式,查询数据并将其带回客户端。但它仍然是结果(而不是查询)通过网络。
答案 1 :(得分:5)
<强>(过时)强> AFAIK无法开箱即可序列化IQueryable&lt;&gt;或表达树(考虑一下 - 这意味着表达式树/ lambda需要序列化并重建函数)
但是,如果有遗嘱,似乎有办法 - 你可能想看看这样的项目 http://code.msdn.microsoft.com/exprserialization
修改:请注意,时间已经发生变化 - 请参阅Marc Gravell发布的WCF RIA服务。
祝你好运!HTH