如何从wcf服务中检索未知类型?

时间:2009-01-24 15:14:09

标签: .net wcf generics

我目前正在开发一种wcf服务,它在数据库中执行一些查找并将数据返回给客户端。用户输入了他想要在文本框中看到的内容的ID。这可以是客户端ID,产品ID,订单ID或其他。服务器上的查找方法尝试在客户端表中查找id。如果它不在那里它会在产品表等上,直到找到它。

当呼叫服务器时,无法分辨用户正在寻找什么。据我所知,我需要指定返回类型设计时间,否则对象的序列化不起作用。我唯一能想到的是包含所有可能对象的helper类,并从wcfservice返回任何更好的想法?

其他信息: 我们正在使用wsHttpBinding和Linq-To-Sql。数据库是遗留的,也使用其他软件,因此数据对象无法更改。

2 个答案:

答案 0 :(得分:1)

您没有提及您用于服务的绑定。如果它是基于SOAP的绑定,例如wsHttpBinding或basicHttpBinding,则必须在编译时知道您的方法可能返回的所有可能类型,以便它们可以在WSDL中公开,并且客户端可以生成代理类。在这种情况下,您必须定义一个包含所有实体将从中派生的id的基类,并使用ServiceKnownTypeAttribute或在app.config / web.config文件中列出它们:

<system.runtime.serialization>
    <dataContractSerializer>
        <declaredTypes>
            <add type="MyNamespace.Entity">
                <knownType type="MyNamespace.Client" />
                <knownType type="MyNamespace.Product" />
                <knownType type="MyNamespace.Order" />
            </add>
        </declaredTypes>
    </dataContractSerializer>
</system.runtime.serialization>

如果您在TCP上使用二进制序列化,则无需在编译时指定已知类型,因为二进制序列化器将传输类型信息。

答案 1 :(得分:1)

您的解决方案应该有效。其他解决方案是:

  1. 如果您的类型有一个公共基类(如Object ;-)),您可以声明Web服务返回此类,并使用KnownTypes属性告诉WCF如何序列化/反序列化子类< / LI>
  2. 让Web服务返回XML并自行序列化和反序列化您的XML。你完全可以控制,但这可能会带来很多额外的工作。