在爲Web服務提供wsdl之前,我已經使用SQL和FOR XML PATH生成了xml。直接生成XML以發送到WCF Web服務是不好的做法嗎?
現在我有了wsdl,我是否應該回過頭來從SQL單獨填充每個對象,是否應該將XML解析爲請求對象(如果可能的話)還是有其他選擇?任何問題都可以提前提醒我?
在爲Web服務提供wsdl之前,我已經使用SQL和FOR XML PATH生成了xml。直接生成XML以發送到WCF Web服務是不好的做法嗎?
現在我有了wsdl,我是否應該回過頭來從SQL單獨填充每個對象,是否應該將XML解析爲請求對象(如果可能的話)還是有其他選擇?任何問題都可以提前提醒我?
據我所知,如果你是從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
末級
如果它有效,它的工作原理。
從WSDL生成客戶端代碼和類與手工創建XML相比有許多好處:它們很容易更新,不容易複製粘貼錯誤,如後者。
感謝您的答覆@CodeCaster。我可以擴展最初的問題嗎? wsdl包含一個內聯xsd,但我可以看到xsd中的限制不在從它創建的對象模型中。內聯xsd是否在運行時的任何時候使用,或者這些驗證實際上是否未被使用?如果正在使用它們,它們在創建對象時還是在對象序列化爲xml時使用? –