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

Remove temporary file after returning in raw format in WCF

我有一个 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 之后立即被调用并抛出异常,因为该文件仍在被进程使用。

当然,这是一种变通方法,就像后台工作人员等待文件可供删除一样,但在我看来,这不是网络服务的实施方式。

无法原谅的快速想到解决方案,这绝对合乎逻辑:我可以简单地将文件内容读入内存并删除文件。

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;
}

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

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

然后您需要做的就是对文件调用 delete 和 return ms:

File.Delete(signedFileName);
return ms;