0

アップロードされたドキュメントを受け取る非常に基本的な 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 を使用することは可能ですか、それともこのアプローチを試みても気にしないでください。

4

1 に答える 1

4

DataContractメッセージは、メッセージとは異なる方法でシリアライズされMessageContractます。メンバーを持つStream(ストリーミングを許可する) には、 を使用する必要がありますMessageContract。wcf は、メンバーがストリーミング用であることを認識し、標準のシリアル化を実行しようとしません。

詳細については、http: //msdn.microsoft.com/en-us/library/ms733742.aspxを参照してください。

データ コントラクト内で System.IO.Stream 派生型を使用しないでください。ストリーム データは、次の「ストリーミング データ」セクションで説明するストリーミング モデルを使用して通信する必要があります。

于 2013-01-09T13:26:05.143 に答える