8

我已经使用 WCF 创建了一个 Web 服务。我无法弄清楚如何通过数据契约在 WSDL/XSD 中设置约束和限制。

如果我使用约束改进 XSD2 架构,然后将此自定义架构绑定到现有服务会怎样?如果是这样,我怎样才能使服务公开改进的 WSDL?否则,还有其他方法可以为 WCF 服务设置元数据吗?

4

3 回答 3

3

请不要混淆 XSD 和 WSDL -这是完全不同的东西

根据您的问题-尝试使用RiaServices。它允许你编写这样的代码

public class Meeting
{
    [Key]
    public int MeetingId { get; set; }

    [Required]
    public DateTime Start { get; set; }

    [Required]
    public DateTime End { get; set; }

    [Required]
    [StringLength(80, MinimumLength = 5)]
    public string Title { get; set; }

    public string Details { get; set; }

    [Required]
    [RegularExpression(@"\d{1,3}/\d{4}",
    ErrorMessage = "{0} must be in the format of 'Building/Room'")]
    public string Location { get; set; }

    [Range(2, 100)]
    [Display(Name = "Minimum Attendees")]
    public int MinimumAttendees { get; set; }

    [Range(2, 100)]
    [Display(Name = "Maximum Attendees")]
    public int MaximumAttendees { get; set; }
}

据我所知,使用约束和限制改进 WSDL 的唯一方法是使用限制属性标记 DataContract 类(如果不是真的,请修复我)

于 2012-06-19T11:29:05.693 回答
1

这似乎是一个普遍的问题。服务元数据描述了数据契约。也就是说,交换数据的结构,没有任何验证信息。

我一直在通过在服务层之上实现一个验证层来解决这个问题。它如下:

除了 WSDL 之外,服务作者和消费者还同意一个改进的 XSD,它描述了除了数据契约的单纯结构之外的所有验证细节。

每一方 (xml) 都针对精炼的 XSD 序列化和验证数据合同。

针对 XSD 验证请求的服务方法的示例“伪代码”。

public string MyServiceMethod(MyDataType m){
    string s = XmlSerialize(m);
    if( XSDValidate(s) ){
        return ProcessRequest(m);
    }else{
        return BuildErrorResponse("The request is not compliant with the contract");
    }
}

服务消费者也可以实现类似的逻辑,在将请求数据发送到服务器之前对其进行验证。

于 2012-06-23T05:45:51.487 回答
1

您基本上有两种创建 Web 服务的方法:

  1. 先上代码。您创建一个类并将其标记为数据合同类以及更多属性。当您编译它时,您的 Web 服务的 WSDL 将从您的类中生成。这是一种快速的方法,通常可以让您对 WSDL 进行足够好的控制。

  2. 首先是架构。您手动创建 WSDL 并使用工具(例如WSCF.Blue或 )从您的 WSDL 生成数据契约类。这将使您完全控制您的 WSDL 模式,但根据我的经验,创建 WSDL 比创建数据合同类需要更多的工作。

于 2012-06-25T16:36:23.310 回答