在WCF中以原始格式返回后删除临时文件

时间:2016-06-02 09:46:02

标签: c# wcf filestream

我有一个WCF服务,它以原始格式工作,使用流:

[ServiceContract]
public interface IEncryptingService
{
    [WebInvoke(UriTemplate = "/")]
    [OperationContract]
    Stream SignDocument(Stream requestStream);
}

public class EncryptingService : IEncryptingService
{
    public Stream SignDocument(Stream requestStream)
    {
        string originalFileName = Path.GetTempFileName();
        string signedFileName = Path.GetTempFileName();

        using (var originalFileStream = File.Open(originalFileName, FileMode.Create, FileAccess.Write))
        {
            requestStream.CopyTo(originalFileStream);
        }

        XmlDocumentSigner.SignFile(originalFileName, signedFileName);

        return File.Open(signedFileName, FileMode.Open, FileAccess.Read);
    }
}

现在,如何在WCF结束文件后删除此文件?

我曾尝试使用finally阻止,但它会在return之后立即调用,并抛出异常,因为该进程仍在使用该文件。

当然,这些是一种解决方法,就像后台工作者等待文件可供删除一样,但在我看来,它与网络服务的实现方式不同。

2 个答案:

答案 0 :(得分:1)

解决方案难以想象得很快,这绝对是合乎逻辑的:我可以简单地将文件内容读取到内存中并删除文件。

public Stream SignDocument(Stream requestStream)
{
    string originalFileName = Path.GetTempFileName();
    string signedFileName = Path.GetTempFileName();

    using (var originalFileStream = File.Open(originalFileName, FileMode.Create, FileAccess.Write))
    {
        requestStream.CopyTo(originalFileStream);
    }

    XmlDocumentSigner.SignFile(originalFileName, signedFileName);

    byte[] signedFileBytes = File.ReadAllBytes(signedFileName);
    File.Delete(signedFileName);
    return new MemoryStream(signedFileBytes);
}

请注意,using语句也会使此代码失败:

using (var ms = new MemoryStream(signedFileBytes))
{
    return ms;
}

答案 1 :(得分:1)

我还没有尝试过,但您可以打开该文件并将该流写入另一个流。类似的东西:

MemoryStream ms = new MemoryStream();
using (FileStream fs = File.OpenRead(signedFileName))
{
    //Read from fs and write to ms
}

然后,您需要做的就是在文件上调用delete并返回ms

File.Delete(signedFileName);
return ms;