アップロードされたドキュメントを受け取る非常に基本的な WCF サービスがあります。次のように定義すると、完全に機能します。
<ServiceContract()>
Public Interface ITransferService
<OperationContract()>
<FaultContractAttribute(GetType(MyProcessingFault))>
Function UploadFile(ByVal request As RemoteFileInfo) As MyWebMethodResult
End Interface
<MessageContract()>
Public Class RemoteFileInfo
Implements IDisposable
<MessageHeader(MustUnderstand:=True)>
Public FileName As String
<MessageHeader(MustUnderstand:=True)>
Public Length As Long
<MessageBodyMember()>
Public FileByteStream As System.IO.Stream
Public Sub Dispose() Implements IDisposable.Dispose
If FileByteStream IsNot Nothing Then
FileByteStream.Close()
FileByteStream = Nothing
End If
End Sub
End Class
ただし、私は MessageContractAttribute の使用について少し混乱していました。ほとんどの著者は、代わりに DataContract を使用して物事をシンプルに保つことを提案しています。ただし、上記を次のように変更すると、このように...
<ServiceContract()>
Public Interface ITransferService
<OperationContract()>
<FaultContractAttribute(GetType(MyProcessingFault))>
Function UploadFile(ByVal request As RemoteFileInfo) As MyWebMethodResult
End Interface
<DataContract()>
Public Class RemoteFileInfo
Implements IDisposable
<DataMember>
Public FileName As String
<DataMember>
Public Length As Long
<DataMember()>
Public FileByteStream As System.IO.Stream
Public Sub Dispose() Implements IDisposable.Dispose
If FileByteStream IsNot Nothing Then
FileByteStream.Close()
FileByteStream = Nothing
End If
End Sub
End Class
サービスにアップロードしようとすると、次の WCF 例外が発生します。
データ コントラクト名が「FileStream:http://schemas.datacontract.org/2004/07/System.IO」の「System.IO.FileStream」と入力することは想定されていません
これを調査したところ、ストリームをシリアル化できないことがわかりましたが、最初の例が機能するには、これは間違いではないでしょうか? DataContract で FileStream を使用することは可能ですか、それともこのアプローチを試みても気にしないでください。