我使用WCF创建了一个Web服务。 我无法弄清楚如何通过数据协定设置WSDL / XSD中的约束和限制。
如果我使用约束改进XSD2架构,然后将此自定义架构绑定到现有服务,该怎么办?如果是这样,我如何使服务公开改进的WSDL? 否则,是否有其他方法可以为WCF服务设置元数据?
答案 0 :(得分:3)
请不要混淆XSD和WSDL - this is totally different things
根据您的问题 - 尝试使用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类(如果不是,请修复我)
答案 1 :(得分: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");
}
}
服务使用者也可以在将请求数据发送到服务器之前实现类似的逻辑来验证请求数据。
答案 2 :(得分:1)
您基本上有两种创建Web服务的方法:
代码优先。您创建一个类并将其标记为datacontract类以及更多属性。编译时,将从您的类生成Web服务的WSDL。这是一种快速方法,通常可以让您对WSDL有足够的控制。
架构优先。您手动创建WSDL并使用工具(例如WSCF.Blue或)从WSDL生成datacontract类。这将使您完全控制您的WSDL架构,但根据我的经验,创建WSDL比创建datacontract类更多。