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

Bind a custom WSDL to an existing WCF Service

提问人:Alberto De Caro 提问时间:6/19/2012 最后编辑:Alberto De Caro 更新时间:6/26/2012 访问量:2600

问:

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

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

C# WCF Web 服务 WSDL XSD

评论


答:

3赞 Andriy Zakharko 6/19/2012 #1

请不要混淆 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 类(如果不是真的,请修复我)

评论

0赞 Alberto De Caro 6/19/2012
谢谢你的澄清。看来RIAServices是我一直在寻找的解决方案。非 MS 客户端可以使用 RIAServices 吗?
1赞 Andriy Zakharko 6/20/2012
RiaServices专为端到端Silverlight和 ASP.NET 解决方案而设计。这并不是拒绝通过PHP或Java使用RiaServices的可能性,但是您可能会在这种方式上发现很多陷阱和陷阱
1赞 xtrem 6/23/2012 #2

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

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

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

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

评论

0赞 Alberto De Caro 6/26/2012
谢谢。这是我目前遵循的方式。但我试图了解是否有可能从数据契约中获取架构及其约束。
1赞 GTG 6/26/2012 #3

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

  1. 代码优先。创建一个类,并将其标记为 datacontract 类以及一些其他属性。编译此内容时,将从类生成 Web 服务的 WSDL。这是一种快速的方法,通常可以让您很好地控制 WSDL。

  2. 架构优先。您可以手动创建 WSDL 并使用工具(例如 WSCF.Blue 或 ) 从 WSDL 生成 datacontract 类。这将使你能够完全控制你的 WSDL 模式,但根据我的经验,创建 WSDL 比创建 datacontract 类更需要做更多的工作。

评论

0赞 Alberto De Caro 6/26/2012
好点子。我先编码了。那么,是否可以塑造数据契约以设置 WSDL 约束?