默认情况下,涉及服务操作实现的所有数据合同实体(及其已知类型)都包含在服务元数据中。 我试图找出,如果有可能在元数据中包含其他类或数据合同。原因是我有一些枚举,可用于填写服务操作中涉及的实体的字符串字段,或者当服务返回错误消息时,它们有一个我想“翻译”或给出含义的标识符它没有引用外部服务的某些程序集。
这样的事情是否可能,或者有其他提示如何解决这个问题?
服务声明的说明性示例如下:
[DataContract(Namespace = "http://schemas.example.com/Common/ExampleServices/V20090903")]
public enum SearchTaskField
{
[EnumMember]
Id,
[EnumMember]
Date,
...
}
[DataContract(Namespace="http://schemas.example.com/Common/ExampleServices/V20090903")]
public class SearchCondition
{
[DataMember(Name = "ColumnName")]
public virtual string ColumnName
{
get; set;
}
[DataMember(Name = "ColumnValue")]
public virtual object ColumnValue
{
get; set;
}
[DataMember(Name = "ObjectType")]
public virtual string ObjectType
{
get; set;
}
}
[ServiceContract(Namespace="http://schemas.examle.com/Common/ExamleServices/V20090903")]
public interface IExampleServiceServiceContract
{
[OperationContract(Name = "Search")]
SearchOut Search(SearchIn messageIn);
}
[MessageContract]
public class SearchIn
{
[MessageBodyMember(Name = "Conditions", Order = 1)]
public virtual IList<Condition> Conditions
{
get; set;
}
}
答案 0 :(得分:5)
您可以使用ServiceKnownType attribute装饰您的服务。这将导致指定的类型包含在元数据中,即使它没有被服务契约直接使用(不涉及其他暴露类型之一的对象图)。
正如您已经完成的那样,您必须将枚举标记为[DataContract]并将每个枚举值标记为[EnumMember]。将以下行添加到ServiceContract接口将在客户端上公开枚举。
请记住,您需要更新服务引用以查看生成代码中的任何更改。
[ServiceKnownType(typeof(SearchTaskField))]
答案 1 :(得分:4)
服务元数据不用于定义API。只有服务实际使用的类型才会反映在元数据中。如果您希望客户端使用其他类型,那么您应该完成与类库完全相同的操作:将共享类型放入共享程序集中。
当然,这不能帮助不运行.NET的客户端,但是通过尝试公开随机类型,你已经远离了SOA,所以你不应该太在意。
答案 2 :(得分:1)
如果您在枚举中添加[DataContract],它们应自动包含在您的元数据中。到目前为止,这是最简单的方法。
您还可以扩展元数据的创建和呈现方式 - 在WCF中,您可以扩展几乎所有内容:-) - 但这涉及更多代码。一个例子是Christian Weyer的“flattening WSDL”服务行为 - 他通过向服务端点添加端点行为来利用创建元数据的过程。
同样,您可以编写自己的端点行为来扩展您的服务 - 但同样:只需使用[DataContract]标记您的枚举类型就可以更轻松地完成这一操作。
马克
更新:我认为你的枚举没有被序列化到元数据中,因为它似乎没有被使用 - 或者这种印象是错误的?
如果您发生了什么情况,例如将“enum”类型的字段添加到您的DataContract类之一?我想,如果它真的被使用了,那么将显示在你的元数据中......
答案 3 :(得分:0)
EnumMember属性是否适合您?