从WCF服务公开未使用的枚举

时间:2010-02-23 19:02:18

标签: wcf enums

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

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

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

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

7 个答案:

答案 0 :(得分:3)

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

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

    // ... some other properties
}

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

当服务本身没有使用枚举时,我不知道如何强制你的枚举出现在你的WSDL中。

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

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

答案 4 :(得分:0)

枚举顶部删除[DataContract]。

如果您希望枚举部分的元素可用,请仅在枚举上使用[DataContract]和[DataMember]对服务的客户,但不是全部。如果你想要枚举的所有成员,你可以不加标记。

答案 5 :(得分:0)

我在其他地方发布了这个,但是我也要在这里添加它...我想我会把它发现在与此相关的内容中。阅读KnownType属性,反序列化器必须有理由认为您可以传递使用KnownType引用的类型。如果反序列化器知道数据协定或方法参数中的所有类型,则不需要使用stinkin“KnownTypes”来完成其工作,因此它会忽略它们。如果你在服务中的某个地方定义了“对象”...呃 - 哦,糟糕的'反序列化器不知道那里可能会有什么类型的类型,所以它会吞噬你所有已知的类型并将它们吐出来客户代理。

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

答案 6 :(得分:0)

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

请参阅https://stackoverflow.com/a/788281/52277