是否可以包含WCF服务元数据中服务操作未使用的类?

时间:2009-09-08 06:34:00

标签: c# wcf web-services

默认情况下,涉及服务操作实现的所有数据合同实体(及其已知类型)都包含在服务元数据中。 我试图找出,如果有可能在元数据中包含其他类或数据合同。原因是我有一些枚举,可用于填写服务操作中涉及的实体的字符串字段,或者当服务返回错误消息时,它们有一个我想“翻译”或给出含义的标识符它没有引用外部服务的某些程序集。

这样的事情是否可能,或者有其他提示如何解决这个问题?

服务声明的说明性示例如下:

[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;
    }
}

4 个答案:

答案 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属性是否适合您?