直接生成XML以发送到WCF Web服务是不好的做法吗?

时间:2015-09-17 09:46:48

标签: xml web-services wcf wsdl for-xml-path

在我获得Web服务的wsdl之前,我已经使用SQL和FOR XML PATH生成了xml。

现在我有wsdl,我应该返回并从SQL单独填充每个对象,我应该将我的XML反序列化为请求对象(如果可能的话)还是有其他选择?你可以提前告诉我任何陷阱吗?

2 个答案:

答案 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

结束班

相关问题