【问题标题】:Exposing Unused Enum from a WCF service从 WCF 服务公开未使用的枚举
【发布时间】:2010-02-23 19:02:18
【问题描述】:

我想向我的客户端应用程序公开一个枚举,而不在我的 WCF 服务中引用它。但是,枚举在客户端应用程序中不可见。以下是我的代码:

[DataContract]
public enum Columns
{
    [EnumMember]
    Column1= 0,
    [EnumMember]
    Column2= 1
}

[ServiceKnownType(typeof(Columns))]
public interface IService
{
    [OperationContract]
    Response GetObjects(Request request);
}

请让我知道我做错了什么?

【问题讨论】:

  • “请求”和“响应”类型是什么样的??

标签: wcf enums


【解决方案1】:

Columns 枚举必须是 RequestResponse 类的属性,因为这些是 WSDL 中包含的唯一类型。在 WSDL 中公开并因此对客户端可见的类型仅是那些用作操作契约方法的输入或输出参数(以及所有它们的类层次结构的一部分)的类型。因此,例如,您可以将枚举添加到 Request 类:

[DataContract]
public class Request
{
    [DataMember]
    public Columns Columns { get; set; }

    // ... some other properties
}

【讨论】:

    【解决方案2】:

    ServiceKnownType 属性旨在提供有关未直接引用的子类的知识。例如,如果您希望 InheritedRequest 类(继承自 Request)能够在您的“GetObjects”方法中使用。

    【讨论】:

      【解决方案3】:

      枚举 顶部删除 [DataContract]。

      如果您希望 enum 中的 一些 元素可用,您只能在 enum 上使用 [DataContract] 和 [DataMember]给服务的客户,但不是全部。如果您想要 enum 的所有成员,则不要标记它。

      【讨论】:

      • 不,不要 - [DataContract] 非常需要 - 但它并不完整 - 我们还需要知道“请求”和“响应”的样子 - 那些应该使用“列”类型在某些方面....
      • @marc_s [DataContract] 不是枚举所必需的,它不会影响是否生成整个枚举。仅当您想公开一些枚举值时才重要。
      【解决方案4】:

      服务的元数据旨在描述与服务交互所需的类型 - 请求和响应消息。您不应尝试在服务元数据中包含随机类型。

      如果你想为你的客户端提供一些随机类型,那么客户端需要引用包含这些类型的类型库。

      【讨论】:

        【解决方案5】:

        当服务本身不使用枚举时,我不知道有任何方法可以强制枚举出现在 WSDL 中。

        但如果您同时维护客户端和服务器,则可以使用包含客户端和服务器使用的类型的共享库。

        在我们的项目中,我们根本不使用 WSDL,我们使用 ChannelFactory 创建客户端代理并从共享 dll 引用接口。

        【讨论】:

          【解决方案6】:

          我在其他地方发布了这个,但我也打算在这里添加它......我想我会抛出我发现的与此相关的内容。阅读有关 KnownType 属性的信息,反序列化器必须有理由认为您使用 KnownType 引用的类型可能会被传递。如果反序列化器知道你的数据契约或方法参数中的所有类型,它就不需要你的臭名昭著的“KnownTypes”来完成它的工作,因此它会忽略它们。如果您将“对象”定义为服务中某处的类型.. 哦,可怜的反序列化器不知道那里可能会出现什么类型,所以它会吃掉您所有已知的类型并将它们吐出来客户端代理。

          黑客?哦耶。如果你很绝望,它有用吗?是的。

          【讨论】:

            【解决方案7】:

            对于类似的要求,我在服务合同中创建了一个虚拟操作 DummyForProxyGeneration,并将我想在代理中生成的类添加到操作请求或响应中。 顺便说一句,由于向后兼容的原因,不建议在 wcf 响应中公开枚举。

            https://stackoverflow.com/a/788281/52277

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-04-03
              • 2018-10-25
              • 2012-08-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多