簡體   English   中英

對於C#.net 2.0 WebService,使用復雜類型編碼輸入參數的正確方法是什么?

[英]What is right way to code input parameters with complex types for a C# .net 2.0 WebService?

我目前正在構建公司已提供的Web服務的新版本。 當前的Web服務的輸入參數為字符串類型。 在該字符串中,將傳遞整個xml文檔。 然后,我們針對xsd(與提供給使用者的xsd相同)驗證該字符串。 看起來像這樣:

[WebMethod]
public bool Upload(string xml)
{
    if (ValidateXML(xml))
    {
        //Do something
    }
}

我正在構建此服務的下一個版本。 我給人的印象是,將XML文檔作為字符串傳遞不是正確的方法。 我當時在想我的服務看起來像這樣:

[WebMethod]
public bool Upload(int referenceID, string referenceName, //etc...)
{
    //Do something
}

我遇到的這個問題是,實際上有大量的輸入參數,其中一些是復雜類型。 例如,上載方法需要采用一個稱為分配的復雜對象。 該對象實際上由幾個整數,十進制值,字符串和其他復雜對象組成。 我是否應該像這樣構建Web服務:

[WebMethod]
public bool Upload(int referenceID, string referenceName, Allocation referenceAllocation)
{
    //Do something
}

還是有其他方法可以做到這一點?

注意:此分配對象在xsd中具有為舊服務提供的層次結構。

可能是原始服務僅采用xml來解決此問題嗎? 是否有更好的方法將復雜類型帶入Web服務?

注意:這是C#2.0 Web服務。

我可能會使用帶有“ xsd.exe”工具的XSD來創建XML Serializable對象。 然后,您可以處理對象而不是字符串參數。 它還使您能夠不更改WebService的簽名。

如果將XSD更改為添加另一個參數,則只需使用XSD.exe工具重新創建該類即可。 在這里充分利用局部類 將自動生成的類與業務邏輯分開。 這樣,如果XSD可以根據需要進行多次更改,則可以重新創建類定義,但不要觸碰您的業務邏輯。

.NET Framework中的XML序列化

如果使用的是3.5,則還可以使用LINQ to XML快速解析出XML參數。

喬恩,首先回答您的后續問題:如果您的客戶端位於多個平台上(或至少不是全部位於.NET上),那么最好的方法是所謂的“ WSDL-first”。 在WSDL中定義服務接口-將在其中定義服務和方法-WSDL將引用一組XSD,這些XSD定義了傳遞給這些方法和從這些方法返回的數據保存對象。 您可以從WSDL / XSD生成C#或Java代碼。

回到您的原始問題。 為了實現相同的可維護性,最佳實踐是為每個Web方法定義Request和Response類,並且切勿直接傳遞字符串,布爾值,整數。 例如,

// in your Web service class
[WebMethod]
public UploadResponse Upload( UploadRequest request ) {
    ...
}
...

[Serializable]
public class UploadResponse {
  public bool IsSuccessful {
    get { ... }
    set { ... }
  }
}

[Serializable]
public class UploadRequest {
  public Allocation ReferenceAllocation {
    get { ... }
    set { ... }
  }
  // define other request properties
  // ...
}

如果您在WSDL文件中定義了SOAP綁定,則會從SOAP消息中提取UploadRequest對象並反序列化。 控件到達WebMethod實現時,您在內存中已反序列化了UploadRequest對象,並設置了其所有屬性。

要擁有這樣的方法:[WebService]類中的public bool Upload(string xml)並在方法實現內部解析XML絕對是您應該考慮的方法。

只要您的復雜類型可以通過XmlSerializable進行,那么使用這些復雜類型就不會有任何問題。 讓框架為您完成繁重的工作。 它將生成一個適當的WSDL,並且數據將全部由自身序列化,而您不必擔心驗證和序列化。

[可序列化]是您的朋友。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM