2

MessageContractを使用せずにファイルをアップロードできるWCFサービスがあります。

[OperationContract, WebInvoke(UriTemplate = "UploadFile?filename={filename}")]
bool UploadFile(string filename, Stream fileContents);

StreamオブジェクトはUriTemplateの一部であるため、Streamオブジェクトの横にある別のパラメーターを使用できます。サービスはマネージドWindowsサービスとして実行されるため、ServiceHostを手動で開始する必要があります。

protected override void OnStart(string[] args)
{
    FileServiceHost = new ServiceHost(typeof(FileService), new Uri("http://" + Environment.MachineName + ":8000/FileService"));
    FileServiceHost.AddServiceEndpoint(typeof(IFile), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());
    FileServiceHost.Open();
}

これらすべてで、サービスが起動し、正常に機能します。ただし、上記の一部をapp.configファイルに移動したかったのです。これを行うために、の2行目をコメントアウトし、OnStart1行目を。に置き換えましたFileServiceHost = new ServiceHost(typeof(FileService))。次に、その情報をapp.configに追加しました...

<system.serviceModel>

<services>
  <service name="Test.Server.FileService" behaviorConfiguration="DefaultBehavior">
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8000/FileService"/>
      </baseAddresses>
    </host>
    <endpoint address="" binding="webHttpBinding" contract="IFile"/>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  </service>
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="DefaultBehavior">
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

そして突然、サービスが起動できなくなります。FileServiceHost.Openメソッドの次の例外をスローしますOnStart。「オペレーションUploadFileのリクエストをストリームにするには、オペレーションにStreamというタイプの単一のパラメーターが必要です。」

app.configでサービスを定義する方法に何か問題があるはずです。そこからサービスを削除すると、すべてが正常に機能するからです。私はここで何が間違っているのですか?

4

2 に答える 2

3

webHttpBindingエンドポイントの動作に追加して問題を修正した方法は次のとおりです。

に追加behaviorConfiguration="TestBehavior"され、次のよう<endpoint address="" binding="webHttpBinding" contract="IFile"/>に定義さTestBehaviorれます。

<endpointBehaviors>
    <behavior name="TestBehavior">
      <webHttp />
    </behavior>
</endpointBehaviors>
于 2011-09-06T19:01:11.420 に答える
1

WCFでストリーミングを有効にするには、複数の制限があります。Streamそれらの1つは、タイプ(または他の2つのタイプのいずれか)の単一のパラメーターを持つことです。

これは、WCFが契約内のコンテンツをストリーミングしようとしていることを「推測」し、デフォルトでに設定したことを意味している可能性がありますTransferModeStreamedこれは純粋に推測です。文書化されているものではありません。ドキュメントにはTransferModeデフォルトが設定されてBufferedいます)。

1つのオプションは、転送モードをBufferedXMLで明示的に設定することです。

<webHttpBinding>
    <binding name="MyWebBinding" transferMode="Buffered"/>
</webHttpBinding>

ただし、Buffered転送モードを使用すると、メッセージの内容は送信される前に完全にバッファリングされます。これは、大きなファイルでは適切ではありません。

別のオプションは、Streamed転送モードを使用することです。ファイルのコンテンツのストリーミングとファイル名の指定を同時に行う場合は、カスタムMessageクラスを定義し、メッセージヘッダーでファイルのメタデータを送信する必要があります。

[MessageContract]
public class UploadFileMessage
{
   [MessageHeader]
   public string Filename { get; set; }

   [MessageBodyMember]
   public Stream Content { get; set; }
}
于 2011-09-06T02:27:57.620 に答える