2011-07-29 5 views
3

私のカスタムWCFサービスには、Sharepointサイトからファイルをダウンロードする方法があります。目的は、DownloadFileを呼び出してストリームを受信することです。SharepointからのWCFストリーミング

[OperationContract] 
Stream DownloadFile(string uri); 

Sharepointのからファイルを取得するためのコードとストリームがある返す:

public Stream DownloadFile(string uri) 
{ 
    // NOTE! we cannot use a using statement as the stream will get closed. 
    var site = new SPSite(uri); 
    var web = site.OpenWeb(); 
    var file = web.GetFile(uri); 

    // some custom authentication code... 

    // NOTE! do not close stream as we are streaming it. 
    return file.OpenBinaryStream(); 
} 

私はストリーミングがあると自動的に適切に閉じられ、WCFサービスによって配置されますストリーミングますストリームを推測コンプリート?

しかし、正しく配置されていないSharePointオブジェクト(サイトとWeb)でこの問題を解決するにはどうすればよいですか?これは長期的には問題になるのだろうか?利用可能な他のアプローチはありますか? Sharepointからファイルをダウンロードするときに実行する必要があるカスタム認証コードがあるので、Sharepoint Client Object Modelを使用したくありません。

正しい方向に私を向ける考えやアイデアはありますか?

UPDATE:

私はこのように、現在のOperationContextにOperationCompletedイベントを使用してこれを解決している場合があります:

OperationContext clientContext = OperationContext.Current; 
clientContext.OperationCompleted += delegate 
            {                 
             if(stream != null)                         
              stream.Dispose(); 
             site.Close(); 
             web.Close(); 
            }; 

たぶん私は、ストリームを配置する必要はありませんか?誰かが上記のアプローチで何か問題があると思っていますか?

+0

あなたの質問は私を大いに助けました。デリゲートとクリーンアップの良いアイデア。ありがとう! – kenchilada

答えて

0

SPSiteとSPWebへの参照がまだ残っていれば、上記は問題ありません。

ほんの少しですが、SPSiteオブジェクトとSPWebオブジェクトでClose()の代わりにDispose()を呼び出すことをお勧めします。