2015-09-17 60 views
0

在爲Web服務提供wsdl之前,我已經使用SQL和FOR XML PATH生成了xml。直接生成XML以發送到WCF Web服務是不好的做法嗎?

現在我有了wsdl,我是否應該回過頭來從SQL單獨填充每個對象,是否應該將XML解析爲請求對象(如果可能的話)還是有其他選擇?任何問題都可以提前提醒我?

+0

感謝您的答覆@CodeCaster。我可以擴展最初的問題嗎? wsdl包含一個內聯xsd,但我可以看到xsd中的限制不在從它創建的對象模型中。內聯xsd是否在運行時的任何時候使用,或者這些驗證實際上是否未被使用?如果正在使用它們,它們在創建對象時還是在對象序列化爲xml時使用? –

+0

< xsd:pattern value =「[a-zA-Z] {1} [a-zA-Z' - ] *」/>

回答

0

據我所知,如果你是從SQL數據庫發佈一個複雜的XML結構到WCF Web服務,那麼使用FOR XML PATH創建整個XML文檔沒有什麼壞處 - 事實上我會說這是更好,更簡單。然後,您可以使用xsd(它將根據xsd:restrictions,minOccurs,maxOcurs等進行驗證)手動對其進行驗證,然後將其反序列化爲由WSDL創建的複雜對象層次結構。請注意,WSDL不執行任何驗證(xsd:restrictions,minOccurs,maxOccurs未在客戶端驗證) - 它只是創建對象層次結構。

這裏假設你很熟悉SQL和XML PATH當然!否則,您可以在代碼中構建對象層次結構,但在調用真正的Web服務之前您不會進行任何驗證。

xsd驗證是一種腰帶和大括號備份,以避免向Web服務發送無效數據。顯然,在現實世界中,無論您發送的數據是否應該通過用戶友好的錯誤消息進行正確驗證。

下面是一些示例代碼:

Imports System.Xml 
Imports System.Xml.Schema 
Imports System.Data.SqlClient 
Imports System.Xml.Serialization 
Imports ClassLibrary1.ServiceReferences.ClientX 
Imports System.IO 
Imports System.Configuration 

Public Class ClientXWebServices 

Private _isValid As Boolean? 
Private _xmlErrorList As New List(Of String) 
Private _xmlWarningList As New List(Of String) 

Sub New() 

End Sub 

Function Send(id As Guid) As StoreData.storeDataResponse 
    Dim xdoc As XmlDocument = New XmlDocument() 
    Using cnn As New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString()) 
     cnn.Open() 
     Dim cmd = New SqlCommand("employer.clientx_xml_setup_select", cnn) 
     cmd.CommandType = CommandType.StoredProcedure 
     cmd.Parameters.AddWithValue("@id", id) 

     Using reader = cmd.ExecuteXmlReader 
      If (reader.Read()) Then 
       xdoc.Load(reader) 
      End If 
     End Using 
    End Using 

    'Validate (belt and braces) 
    Dim myschema As XmlSchema 
    Using reader As XmlTextReader = New XmlTextReader("storeData.xsd") 
     myschema = XmlSchema.Read(reader, Nothing) 
    End Using 
    xdoc.Schemas.Add(myschema) 
    xdoc.Validate(AddressOf DocumentValidationCallback) 
    If Not _isValid.HasValue Then 
     _isValid = True 
    End If 
    If _isValid = False Then 
     MsgBox(String.Join(vbCrLf, _xmlErrorList.Union(_xmlWarningList).ToArray)) 
     Return Nothing 
    End If 

    Dim xmlSer As XmlSerializer = New XmlSerializer(GetType(StoreData.storeDataRequest)) 
    Dim ssdr As StoreData.storeDataRequest = xmlSer.Deserialize(New StringReader(xdoc.OuterXml)) 
    Dim client As New StoreData.StoreDataClient 
    Dim response As StoreData.storeDataResponse 
    Try 
     response = client.ServiceReferences_CLIENTX_StoreData_StoreData_storeData(ssdr) 
    Catch ex As Exception 
     Throw New IOException("ClientX Web Service 'StoreData' could not be contacted.", ex) 
    End Try 

    Return response 
End Function 

Sub DocumentValidationCallback(ByVal sender As Object, ByVal args As ValidationEventArgs) 
    If args.Severity = XmlSeverityType.Warning Then 
     _xmlErrorList.Add(args.Message) 
    ElseIf args.Severity = XmlSeverityType.Error Then 
     _xmlWarningList.Add(args.Message) 
    End If 
    _isValid = False 
End Sub 

末級

1

如果它有效,它的工作原理。

從WSDL生成客戶端代碼和類與手工創建XML相比有許多好處:它們很容易更新,不容易複製粘貼錯誤,如後者。

相關問題