【问题标题】:Cannot open file不能打开文件
【发布时间】:2013-10-03 19:50:22
【问题描述】:

我正在使用此代码通过网络服务读取文件,

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 消息、WebResponse 响应、流 responseStream、布尔值 asyncCall) 在 System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(字符串 methodName, Object[] 参数)在

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

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

【问题讨论】:

  • filename.pdf 不存在?或者至少不在服务正在查找的目录中?尝试包含文件的整个路径。
  • 这个异常有内部异常吗?
  • @DStanley 它随机发生...并在下一刻起作用。
  • 你试过File.Exists(path)吗?
  • @Renan Nope code 在生产服务器上,没有其他异常

标签: c# web-services file


【解决方案1】:

使用this method 使用共享访问打开文件

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

编辑添加

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

【讨论】:

  • 查看补充回答
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多