我使用WCF创建了一个Web服务。
我无法通过数据契约来设置WSDL/XSD中的约束和限制。
如果我通过约束来改进XSD2模式,然后绑定该自定义模式到现有服务上,那么如何使服务暴露改进后的WSDL呢?否则,是否有其他方法可以为WCF服务设置元数据呢?
我使用WCF创建了一个Web服务。
我无法通过数据契约来设置WSDL/XSD中的约束和限制。
如果我通过约束来改进XSD2模式,然后绑定该自定义模式到现有服务上,那么如何使服务暴露改进后的WSDL呢?否则,是否有其他方法可以为WCF服务设置元数据呢?
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外,服务提供者和消费者还同意使用精细的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服务基本上有两种方法:
先编写代码。您可以创建一个类并将其标记为数据契约类,再添加一些属性。当您编译此类时,您的Web服务的WSDL将从该类生成。这是一种快速的方法,通常可以让您对WSDL具有足够的控制。
先编写架构。您可以手动创建WSDL,并使用工具(例如WSCF.Blue)从WSDL生成数据契约类。这将使您完全控制WSDL架构,但根据我的经验,创建WSDL比创建数据契约类更费力。