我有一个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
之后立即调用,并抛出异常,因为该进程仍在使用该文件。
当然,这些是一种解决方法,就像后台工作者等待文件可供删除一样,但在我看来,它与网络服务的实现方式不同。
答案 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;