【问题标题】:WCF. Service generic methodsWCF。服务通用方法
【发布时间】:2010-05-25 16:54:34
【问题描述】:

如何在 wcf 服务中使用泛型方法?

我写了这段代码:

[OperationContract]
void AddItem<T>(T item);

但我收到以下错误:

类型“T”不能导出为模式类型,因为它是开放的泛型类型。如果泛型类型的所有泛型参数类型都是实际类型,则只能导出泛型类型。

【问题讨论】:

    标签: c# wcf generics


    【解决方案1】:

    你根本做不到。这是不可能的,因为肥皂不支持这一点。请参阅此article,其中提到了如何通过创建一个中间本地对象来绕过泛型,该对象在调用 WCF 操作之前调用并强制转换该对象。

    【讨论】:

      【解决方案2】:

      您不应该尝试这样做。在启用 SOAP 的 Web 服务中,在发布 WSDL 时需要知道所有类型,以便客户端能够生成代理。 SOAP 规范中根本不存在泛型。 SOAP 旨在实现互操作性,并非所有语言都存在泛型。

      【讨论】:

        【解决方案3】:

        正如所有其他人已经提到的,WCF 和 SOAP 不支持这一点。问题是:您在客户端和服务器之间来回传递的任何内容都必须可以在 XML 模式文档中表达。

        XML 模式支持所有常见的原子类型,如字符串、整数、日期时间 - 它支持由这些原子类型组成的复杂类型,并且支持继承。

        但是 XML 模式不支持泛型 - 因此,您通过 WCF 和 SOAP 交换的任何内容都不能是泛型的 - 您只需要使用具体的非泛型类型。

        我也不知道有什么办法可以解决这个问题。这是一个限制,你现在必须忍受它。

        【讨论】:

          【解决方案4】:

          可以使用数据契约中的有界泛型类型,但必须是服务契约中指定的类型参数,并且作为有效数据契约的指定类型参数

          【讨论】:

            【解决方案5】:

            错误表示不允许打开类型。可能允许的是:

            [OperationContract]
            void AddItem<T>(T item) where T : MyBaseType;
            

            当然,所有继承的类型都应该加上 KnownType 属性。

            【讨论】:

            • 不幸的是,从我刚刚完成的测试来看,这似乎不起作用。它仍然抱怨它是一个开放的泛型类型。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-27
            • 2014-11-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多