20

ストリーム自体の横に追加のパラメーターが必要なため、メッセージコントラクトで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 私自身の答えを参照してください。

4

3 に答える 3

8

私はついにエラーが何であるかを見つけました:それはSoapバージョン、ストリームなどとは何の関係もありませんでした...私は自分のサービスの名前(!)を.FileTransferの代わりに使用してスペルを間違えましたFileTransferService

結局、basicHttpBindingは完全に問題なく、カスタムバインディングに頼る必要はありませんでした。

元の(悪い)バージョン:

<service 
    behaviorConfiguration="serviceBehavior"
    name="Acme.Service.FileTransfer">
    <endpoint address="" 
        name="basicHttpStream" 
        binding="basicHttpBinding"
        bindingConfiguration="httpLargeMessageStream" 
        contract="Acme.Service.IFileTransferService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>

新しい(修正された)バージョン:

<service 
    behaviorConfiguration="serviceBehavior"
    name="Acme.Service.FileTransferService">
    <endpoint address="" 
        name="basicHttpStream" 
        binding="basicHttpBinding"
        bindingConfiguration="httpLargeMessageStream" 
        contract="Acme.Service.IFileTransferService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>

それでも、エラーメッセージがここで何が起こっているのかを理解するのに役立ったとは言えません。

サービス全体に興味がある場合は、次のリンクにある私のブログで詳細を確認できます:WCFを使用したファイル転送

于 2009-08-28T10:48:22.090 に答える
2

リクエストとレスポンスの両方でストリーミング(つまり、膨大なデータ量の転送)が必要ですか?または、応答(通常:ファイルまたは大きなデータセットのダウンロード)だけですか?

応答のみが必要な場合は、transfermodeを「StreamedResponse」に設定してみてください。

<customBinding>
    <binding name="customHttpBindingStream">
        <textMessageEncoding messageVersion="Soap12" />
        <httpTransport transferMode="StreamedResponse" 
                       maxReceivedMessageSize="2147483647"/>
    </binding>
</customBinding>

「ストリーミング」設定は、両方の方法でストリーミングします。サーバーに送信される要求とサーバーからの応答の両方がストリーミングされます。多くの場合、それは理想的なシナリオではありません。

マーク

于 2009-08-27T14:08:15.397 に答える
0

「WCFサービス」テンプレートの代わりに「WCFデータサービス」テンプレートを使用してsvcファイルを生成した後、エラーが発生しました。サービスホストファイルを修正すると、問題が解決しました。

于 2012-07-06T11:33:47.127 に答える