ストリーム自体の横に追加のパラメーターが必要なため、メッセージコントラクトでWCFストリーミングを使用しようとしています。
基本的に、私はファイルのアップロードとダウンロードのサービスを作成しており、その上にいくつかの追加のロジックがあります。
残念ながら、ブラウザからサービスにアクセスしてすべてが正常であることを確認しようとすると、次のエラーが発生します。
'/'アプリケーションのサーバーエラー。コントラクト「IFileTransferService」の操作「UploadFile」は、SOAPヘッダーを持つMessageContractを使用します。SOAPヘッダーは、NoneMessageVersionではサポートされていません。
残念ながら、それをグーグルで検索しても、私を助ける重要な結果は得られませんでした。助けてもらえますか?ここにサービスの詳細があります(スペースの都合でダウンロード部分を削除しました)。
[ServiceContract(Namespace = "http://www.acme.org/2009/04")]
public interface IFileTransferService
{
[OperationContract(Action = "UploadFile")]
void UploadFile(FileUploadMessage request);
}
[MessageContract]
public class FileUploadMessage
{
[MessageHeader(MustUnderstand = true)]
public FileMetaData Metadata { get; set; }
[MessageBodyMember(Order = 1)]
public Stream FileByteStream { get; set; }
}
[DataContract(Namespace = "http://schemas.acme.org/2009/04")]
public class FileMetaData
{
[DataMember(Name="FileType", Order=0, IsRequired=true)]
public FileTypeEnum fileType;
[DataMember(Name="localFilename", Order=1, IsRequired=false)]
public string localFileName;
[DataMember(Name = "remoteFilename", Order = 2, IsRequired = false)]
public string remoteFileName;
}
私はbasichttpbindingとcustomhttpバインディングの両方を使用しようとしましたが、プラスの効果はありませんでした。
<customBinding>
<binding name="customHttpBindingStream">
<textMessageEncoding messageVersion="Soap12" />
<httpTransport transferMode="Streamed" maxReceivedMessageSize="2147483647"/>
</binding>
</customBinding>
更新:オンラインでドキュメントを読むと、MessageContractsを使用したストリーミングが実際に可能になるはずです。たとえば、MSDN(ラージデータとストリーミング)を参照してください。
ストリーミング転送のプログラミングモデル
ストリーミングのプログラミングモデルは単純です。ストリームデータを受信する場合は、単一のストリーム型入力パラメーターを持つ操作コントラクトを指定します。ストリーミングされたデータを返す場合は、ストリーム参照を返します。[...]このルールは、メッセージコントラクトにも同様に適用されます。次のメッセージコントラクトに示されているように、ストリームであるメッセージコントラクトに含めることができるボディメンバーは1つだけです。追加情報をストリームと通信する場合は、この情報をメッセージヘッダーに含める必要があります。メッセージ本文は、ストリームコンテンツ専用に予約されています。
[MessageContract]
public class UploadStreamMessage
{
[MessageHeader]
public string appRef;
[MessageBodyMember]
public Stream data;
}
また、ファイルのアップロードとダウンロードのサービスを実行している人々からのブログ投稿も、私がまとめようとしているものと非常によく似ています(たとえばここ)。
UPDATE 2 小さなコンソールを作成し、basicHttpBindingを使用してサービスをセルフホスティングしようとしましたが、それは魅力のように機能します。問題はIISでのホスティングにあるのではないかと私は信じ始めています。何か案が?
更新3 私自身の答えを参照してください。