У меня есть службы 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
и выдает исключение, так как файл все еще используется процессом.
Конечно, это обходной путь, как работник фона, ожидающий наличия файла для удаления, но, на мой взгляд, это не похоже на то, как веб-сервисы должны быть реализованы.
Не удается избежать использования файлов в первую очередь? Вместо этого использовать (в памяти) потоки? –
@ Christian.K К сожалению, 'XmlDocumentSigner' является оберткой вокруг внешней неуправляемой библиотеки DLL, которая использует очень специфические алгоритмы (без управляемых или не файловых альтернативных библиотек) и может только подписывать файлы :( –