在 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;
我有一个 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;