2013-09-27 178 views
0

我使用此代碼使用Web服務來讀取文件,無法打開文件

FileStream stream = File.OpenRead(FileName); 
byte[] contents = new byte[stream.Length]; 
stream.Read(contents, 0, (int)stream.Length); 
stream.Close(); 

,但我得到這個錯誤

System.Web.Services.Protocols.SoapException:服務器無法到 處理請求。 --->無法打開文件「fileName.pdf」。 --->不能 打開文件「filename.pdf」。在在 System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(字符串 方法名 System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage 消息,WebResponse的響應,流responseStream,布爾 asyncCall),對象[]參數)at

它是隨機的,有時它通過錯誤有時它不會。

代碼被200多個用戶使用,它只是隨機拋出異常。

+1

'filename.pdf'不存在?或者至少不在服務所在的目錄中?嘗試將_entire_路徑包含到文件中。 –

+0

此異常是否有內部異常? – Renan

+0

@DStanley它隨機發生......並在下一刻工作。 – Mathematics

回答

0

請原諒我對Web服務的HTTP實現的無知,它可能會解釋爲 ,但如果您同時處理請求,則兩個請求可能會同時導致文件爭用。

您可以用代碼中的lock(obj){}或一些更復雜的編組來解決此問題。

0

打開使用this method

public static FileStream Open(
    string path, 
    FileMode mode, 
    FileAccess access, 
    FileShare share 
) 

編輯使用共享訪問的文件已添加

只是可以肯定,你可以打開此文件的任何地方,你需要打開它的共享。如果有任何超大的Web服務器可以打開文件(並且你不能讓它共享只讀)。您可以通過在打開文件時捕獲異常,睡眠100毫秒(或其他小量)並重試至n次,來解決問題。這不是一個好的解決方案,只是一個解決問題的方法,因爲你會將你的服務器線程捆綁在一起,你會這樣做。但是,如果這種破解工作,你會知道這是實際的問題(文件爭用)

+0

謝謝,但沒有任何不同的先生 – Mathematics

+0

請參閱附加答案 –