我的自定义WCF服务提供了一种从Sharepoint网站下载文件的方法。目的是调用DownloadFile,然后接收流。

[OperationContract]
Stream DownloadFile( string uri );


从Sharepoint提取文件并返回Stream的代码是:

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服务自动正确关闭和处置吗?

但是,我应该如何使用未正确处理的共享点对象(站点和Web)解决问题?从长远来看这会是一个问题吗?还有其他方法可用吗?我不想使用Sharepoint客户端对象模型,因为从Sharepoint下载文件时,我需要执行一些自定义身份验证代码。

有什么想法或想法可以指出正确的方向吗?

更新:

我可能通过在当前OperationContext上使用OperationCompleted事件来解决此问题,如下所示:

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


也许我不需要处理流?有人认为上述方法有问题吗?

最佳答案

只要您仍然对SPSite和SPWeb有参考,然后可以将它们丢弃,上述内容就可以了。

仅一小部分,最佳实践是在SPSite和SPWeb对象上调用Dispose()而不是Close()。

关于c# - 来自Sharepoint的WCF流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6870965/

10-16 08:54