使用WCF的IQueryable问题

Pil*_*tor 7 .net c# wcf iqueryable

我有一个非常简单的WCF服务方法,它返回一个IQueryable,仅用于测试.也许我在试图了解IQueryable的设计时遇到了什么问题.我明确计划稍后将其与NHibernate的IQueryable提供程序一起使用.但是,每当使用返回IQueryable的WCF方法时,我首先遇到某种序列化问题(至少我认为这可能是问题).它甚至不适用于简单的字符串.

这是我的代码:

public IQueryable<string> GetEquipmentConfigurations()
{
  var returnValue = new List<string>();
  returnValue.Add("test");
  return returnValue.AsQueryable();
}
Run Code Online (Sandbox Code Playgroud)

它可能没什么意义,只是为了测试我是否真的使用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>
Run Code Online (Sandbox Code Playgroud)

为接口设置OperationContract属性:

[OperationContract]
IQueryable<string> GetEquipmentConfigurations();
Run Code Online (Sandbox Code Playgroud)

只返回一个简单的字符串,一切正常.无论如何,我想稍后使用LINQ从IQueryable功能中获利.

有人知道这里出了什么问题吗?

谢谢和干杯,

斯特凡

Mar*_*ell 10

核心WCF旨在发送数据,而不是查询.坚持回归List<Foo>等; 它会让你头疼.

但是,使用WCF数据服务可以获得更多的运气,这可以让您公开源代码IQueryable<>.

这种方法的工作方式是工具构建一个客户端,暴露类似的 IQueryable<>钩子; 当您查询数据时,它表示线上的表达式,查询数据并将其带回客户端.但它仍然是通过电线的结果(而不是查询).


Stu*_*tLC 5

(已淘汰) AFAIK开箱即可序列化IQueryable <>或表达式树(考虑一下 - 这意味着表达式树/ lambda需要序列化并重建函数)

但是,如果有遗嘱,似乎有办法 - 你可能想看一下像这样的项目 http://code.msdn.microsoft.com/exprserialization

编辑:请注意,时间已经改变 - 请参阅Marc Gravell的帖子中的WCF RIA服务.

祝好运!

HTH