0

Web サービスの wsdl を受け取る前に、SQL と FOR XML PATH を使用して XML を生成していました。

これで wsdl ができました。戻って SQL から各オブジェクトを個別に入力する必要がありますか、XML をリクエスト オブジェクトに逆シリアル化する必要がありますか (可能な場合)、それとも別の選択肢がありますか? 事前に警告できる問題はありますか?

4

2 に答える 2

0

複雑な xml 構造を SQL データベースから 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

クラス終了

于 2015-09-18T17:05:48.683 に答える