2010-02-23 74 views
2

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

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

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

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

+0

什么是“请求”和“响应”类型? – 2010-02-23 19:28:40

回答

3

Columns枚举需要属于RequestResponse类,因为这些是WSDL中包含的唯一类型。 WSDL中公开的类型以及可见的向客户端公开的类型只是那些用作操作契约方法的输入或输出参数(以及它们的类层次结构的一部分)的类型。因此,例如,你可以在枚举添加到请求类:

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

    // ... some other properties 
} 
1

的ServiceKnownType属性旨在提供有关不直接引用子类的知识。例如,如果您想要一个InheritedRequest类(它从Request继承)可以在“GetObjects”方法中使用。

0

enum上删除[DataContract]。

,如果你想一些在枚举元素可用的服务的客户端,你只在枚举使用[DataContract]和[DataMember]标注,但不是全部。如果您想要枚举的所有成员,请将其保留为untagged。

+0

不,不需要[DataContract]是非常需要的 - 但它并不完整 - 我们还需要知道“请求”和“响应”是怎么样的 - 在某些方面应该使用“列”类型。 ... – 2010-02-23 19:48:19

+0

@marc_s [DataContract]对于枚举不是必需的,如果整个枚举将被生成,则不会生效。如果你想暴露一些枚举值,这一点很重要。 – 2012-04-14 22:51:20

1

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

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

1

我不知道任何方式强制你的枚举出现在你的WSDL中,当它没有被服务使用时。

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

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

0

我在其他地方张贴了这个,但我也要在这里添加它......我想我会抛出我发现的与此相关的东西。阅读关于KnownType属性的信息,反序列化器必须有理由认为可能传递了与KnownType引用的类型。如果反序列化器知道你的数据合约或方法参数中的所有类型,它就不需要你的stinkin'“KnownTypes”来完成它的工作,所以它忽略它们。如果你的“对象”被定义为你的服务中的某个类型的话。嗯,哦,糟糕的解串器并不知道可能通过那里的类型是什么类型,所以它会吃掉所有已知的类型并将它们吐出客户端代理。

黑客?哦耶。如果你绝望,它是否工作?是的。

0

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

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