在我获得Web服务的wsdl之前,我已经使用SQL和FOR XML PATH生成了xml。
现在我有wsdl,我应该返回并从SQL单独填充每个对象,我应该将我的XML反序列化为请求对象(如果可能的话)还是有其他选择?你可以提前告诉我任何陷阱吗?
答案 0 :(得分:1)
如果有效,它就有效。
从WSDL生成客户端代码和类比手工编写XML有许多好处:它们很容易更新,并且不容易出现像后一个选项那样的复制粘贴错误。
答案 1 :(得分:0)
据我所知,如果您将一个复杂的xml结构从SQL数据库发布到WCF Web服务,那么使用FOR XML PATH创建整个xml文档没有任何害处 - 实际上我会说它更好而且更简单。然后,您可以针对xsd(将针对xsd:limits,minOccurs,maxOcurs等进行验证)手动验证它,然后将其反序列化为WSDL创建的复杂对象层次结构。请注意,WSDL不进行任何验证(xsd:limits,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
结束班