2016-06-02 9 views
0

에 원시 형식으로 반환 후 임시 파일을 제거?내가 스트림을 사용하여 원시 형식으로 작동하는 WCF 서비스를 WCF

나는 finally 블록을 사용하려고 시도했지만, return 직후에 호출되고 예외가 발생합니다. 파일은 여전히 ​​프로세스에 의해 사용되므로 예외입니다.

물론 이것은 파일을 삭제할 수있을 때까지 기다리는 백그라운드 작업자와 같은 해결 방법이지만 웹 서비스 구현 방법과는 다릅니다.

+2

당신이 처음에 파일을 사용하지 않도록 할 수 없습니다

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

그런 다음 당신이해야 할 모든 파일을 삭제하고 ms 돌아 호출입니까? 대신 (메모리에서) 스트림을 사용 하시겠습니까? –

+0

@ Christian.K 불행히도,'XmlDocumentSigner'는 매우 특정한 알고리즘 (관리되지 않거나 파일 기반이 아닌 대체 라이브러리가 없음)을 사용하는 외부의 비 관리 DLL 라이브러리를 감싸는 래퍼입니다. ( –

답변

1

이 솔루션은 간단히 생각할 수 없을만큼 빨리 마음에 들었고, 그것은 논리적으로 절대적입니다. 파일 내용을 메모리로 읽어 들이고 파일을 제거하기 만하면됩니다. 나는 그것을 시도하지 않은

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

귀하의 답변을 찾을 수있게되었습니다. 귀하의 것 또한 덜 복잡한 버전입니다! – TheLethalCoder

+0

@ TheLethalCoder Thanks :) –

+0

여기를 참조하십시오 : https://devdump.wordpress.com/2008/12/07/disposing-return-values/. 그들은 처분에 대해 이야기하지만, 당신은 OperationCompleted에 가입하고 거기서 당신의 파일을 삭제할 수 있습니다. 전체 파일을 메모리에 복사하는 것보다 낫습니다. – Evk

1

하지만 당신은 파일을 열고 다른 스트림에 그 스트림을 작성할 수 using 문이 코드를하게하는 것으로

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

도 실패합니다. 같은 뭔가 :

File.Delete(signedFileName); 
return ms;