2012-06-19 88 views
8

我已經使用WCF創建了一個Web服務。 我無法弄清楚如何通過數據約定來設置WSDL/XSD中的約束和限制。將自定義的WSDL綁定到現有的WCF服務

如果我使用約束改進XSD2模式,然後將此自定義模式綁定到現有服務,該怎麼辦?如果是這樣,我該如何讓服務公開改進的WSDL? 否則,是否有任何其他方式來設置WCF服務的元數據?

回答

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

服務消費者也可以實現類似的邏輯將其發送到服務器之前驗證所述請求的數據。

+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是紀念你DataContract類與限制屬性(修理我,如果這不是真的)

+0

謝謝澄清。 看來RIAServices是我正在尋找的解決方案。 非MS客戶端是否可以使用RIAServices? –

+1

RiaServices專爲端到端Silverlight和ASP.NET解決方案設計。這並不是拒絕通過PHP或Java來使用RiaServices的可能性,但是您可能會發現很多陷阱和陷阱 –

1

你基本上創建一個Web服務的方法有兩種:

  1. 代碼第一。您創建一個類並將其標記爲datacontract類以及一些其他屬性。當你編譯這個時,你的Web服務的WSDL將從你的類中生成。這是一種快速方法,通常可以很好地控制WSDL。

  2. Schema first。您可以手動創建WSDL並使用工具(例如WSCF.Blue或)從您的WSDL生成datacontract類。這將使您完全控制WSDL模式,但根據我的經驗,創建WSDL的工作比datacontract類多。

+0

好點。我已經編碼了。那麼,爲了設置WSDL約束,是否可以塑造數據合同? –