Web サービスの wsdl を受け取る前に、SQL と FOR XML PATH を使用して XML を生成していました。
これで wsdl ができました。戻って SQL から各オブジェクトを個別に入力する必要がありますか、XML をリクエスト オブジェクトに逆シリアル化する必要がありますか (可能な場合)、それとも別の選択肢がありますか? 事前に警告できる問題はありますか?
Web サービスの wsdl を受け取る前に、SQL と FOR XML PATH を使用して XML を生成していました。
これで wsdl ができました。戻って SQL から各オブジェクトを個別に入力する必要がありますか、XML をリクエスト オブジェクトに逆シリアル化する必要がありますか (可能な場合)、それとも別の選択肢がありますか? 事前に警告できる問題はありますか?
複雑な 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
クラス終了