提问人:Alberto De Caro 提问时间:6/19/2012 最后编辑:Alberto De Caro 更新时间:6/26/2012 访问量:2600
将自定义 WSDL 绑定到现有 WCF 服务
Bind a custom WSDL to an existing WCF Service
问:
我使用 WCF 创建了一个 Web 服务。 我无法弄清楚如何通过数据协定在 WSDL/XSD 中设置约束和限制。
如果我使用约束改进 XSD2 架构,然后将此自定义架构绑定到现有服务,该怎么办?如果是这样,我怎样才能使服务公开改进的 WSDL? 否则,是否有其他方法可以设置 WCF 服务的元数据?
答:
请不要混淆 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 类(如果不是真的,请修复我)
评论
这似乎是一个普遍的问题。服务元数据描述数据协定。也就是说,交换数据的结构,没有任何验证信息。
我一直在通过在服务层之上实现验证层来解决这个问题。它如下:
除了 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");
}
}
服务使用者还可以实现类似的逻辑,在将请求数据发送到服务器之前对其进行验证。
评论
基本上有两种创建 Web 服务的方法:
代码优先。创建一个类,并将其标记为 datacontract 类以及一些其他属性。编译此内容时,将从类生成 Web 服务的 WSDL。这是一种快速的方法,通常可以让您很好地控制 WSDL。
架构优先。您可以手动创建 WSDL 并使用工具(例如 WSCF.Blue 或 ) 从 WSDL 生成 datacontract 类。这将使你能够完全控制你的 WSDL 模式,但根据我的经验,创建 WSDL 比创建 datacontract 类更需要做更多的工作。
评论