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.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall) 在 System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) 在

它也是随机的,有时它通过错误有时它没有。

代码被 200 多个用户使用,它只会随机抛出异常。

4

2 回答 2

0

使用此方法使用共享访问打开文件

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

编辑添加

可以肯定的是,任何可以打开此文件的地方,都需要打开它共享。如果有任何超大的网络服务器可以打开文件(并且您也不能使其共享只读)。您可以通过在打开文件时捕获异常、休眠 100 毫秒(或其他少量)并重试最多 nn 时间来解决此问题。这不是一个好的解决方案,只是一个解决问题的技巧,因为你会占用你的服务器线程,你会这样做。但是,如果这个 hack 有效,你就会知道这是真正的问题(文件争用)

于 2013-09-27T14:00:22.280 回答
0

请原谅我对 Web 服务的 HTTP 实现一无所知,这可能是造成这种情况的原因,但如果您同时处理请求,那么同时两个请求可能会导致文件争用。

您可以通过在代码周围使用 lock(obj){ } 或更复杂的编组来解决此问题。

于 2013-09-27T13:50:29.777 回答