代码之家  ›  专栏  ›  技术社区  ›  Sorskoot

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

  •  3
  • Sorskoot  · 技术社区  · 16 年前

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

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

    其他信息: 我们使用的是wshttpbinding和linq-to-sql。数据库是遗留的,也使用了其他软件,因此不能更改数据对象。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Darin Dimitrov    16 年前

    你没有提到你的服务使用的绑定。如果它是基于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上使用二进制序列化,则不必在编译时指定已知类型,因为二进制序列化程序将传输类型信息。

        2
  •  1
  •   oefe    16 年前

    你的解决方案应该有效。其他解决方案包括:

    1. 如果您的类型有一个公共的基类(如object;-),则可以声明Web服务以返回此类,并使用 KnownTypes 属性来告诉wcf如何序列化/反序列化子类
    2. 让Web服务返回XML并自己对XML进行序列化和反序列化。你已经完全控制了,但这可能需要很多额外的工作。