【问题标题】:How to retrieve unknown type from wcf service?如何从 wcf 服务中检索未知类型?
【发布时间】:2009-01-24 15:14:09
【问题描述】:

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

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

其他信息: 我们正在使用 wsHttpBinding 和 Linq-To-Sql。该数据库是旧的,并且还使用了其他软件,因此无法更改数据对象。

【问题讨论】:

    标签: .net wcf generics


    【解决方案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 上使用二进制序列化,则无需在编译时指定已知类型,因为二进制序列化器将传输类型信息。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-11
        相关资源
        最近更新 更多