将自定义WSDL绑定到现有的WCF服务

8

我使用WCF创建了一个Web服务。

我无法通过数据契约来设置WSDL/XSD中的约束和限制。

如果我通过约束来改进XSD2模式,然后绑定该自定义模式到现有服务上,那么如何使服务暴露改进后的WSDL呢?否则,是否有其他方法可以为WCF服务设置元数据呢?

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并添加限制的唯一方法是使用restrict属性标记您的DataContract类(如果不正确,请纠正我)。

感谢您的澄清。 看起来RIAServices是我正在寻找的解决方案。 非微软客户端能否使用RIAServices? - Alberto De Caro
1
RiaServices专为端到端的Silverlight和ASP.NET解决方案而设计。这并不排斥通过PHP或Java使用RiaServices的可能性,但您可能会在这条路上遇到许多陷阱和问题。 - Andriy Zakharko

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");
    }
}

服务使用者在将请求数据发送到服务器之前,也可以实施类似的逻辑来验证请求数据。

谢谢。这是我目前正在遵循的方式。但我正在尝试了解是否可以从数据合同中获取模式及其约束。 - Alberto De Caro

1

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

  1. 先编写代码。您可以创建一个类并将其标记为数据契约类,再添加一些属性。当您编译此类时,您的Web服务的WSDL将从该类生成。这是一种快速的方法,通常可以让您对WSDL具有足够的控制。

  2. 先编写架构。您可以手动创建WSDL,并使用工具(例如WSCF.Blue)从WSDL生成数据契约类。这将使您完全控制WSDL架构,但根据我的经验,创建WSDL比创建数据契约类更费力。


好的观点。我已经编写了代码。那么,是否有可能塑造数据合同以设置WSDL约束? - Alberto De Caro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接