【问题标题】:Can a large file stored by my WCF service become corrupted?我的 WCF 服务存储的大文件会损坏吗?
【发布时间】:2019-01-26 01:52:36
【问题描述】:

这里的问题是,我有一个 WCF 服务来上传文件,该服务似乎适用于小文件,但对于大文件,它似乎会损坏它们或损坏它们,因此我以后无法打开它们。

我希望它们不超过 5MB,所以我设置了绑定,正如我在许多帖子中看到的那样:

<bindings>
  <webHttpBinding>
    <binding name="httpsBinding"
             maxReceivedMessageSize ="5000000"
             maxBufferPoolSize ="5000000"
             maxBufferSize="5000000"
             transferMode ="Streamed">
      <readerQuotas  maxArrayLength="5000000" maxStringContentLength="5000000" />
      <security mode="None"/>
    </binding>
  </webHttpBinding>      
</bindings>

文件正在上传并存储在使用 samba 共享的 lynux 文件夹中。 一切正常,任何类型的文件都保存为 xlsx、png、jpg、pdf、txt,问题是当文件的大小大于(我不知道确切的限制)时,假设 1MB 我无法打开文件保存在服务器中。我已经测试了数百 KB 的文件并且可以工作,但是在服务器中保存了一个 3MB 的 excel 文件和一个 1.7MB 的 png 图像,但是当我尝试使用我为文件提供的链接或直接从文件夹中打开它们时出现一些信息。在 excel 文件中,出现有关找不到 appdata 临时文件的内容,并且在 png 中出现一条消息,告诉“我们似乎无法打开此类文件”。我不知道正确的单词是否已损坏,但文件是否会在流或保存过程中以某种方式损坏?

在这里感谢您的帮助。 我没有提供更多代码,因为在编译期间或调用服务时没有错误消息,所以我没有堆栈跟踪来具体显示问题发生的位置。 文件的大小与原始文件相同吗?是的!

【问题讨论】:

  • 邮件大小应该更大恕我直言。关于您的问题,我建议对传入字节进行校验和(md5)并检查它是否符合您的预期。
  • 谢谢@bradbury9 我认为这是一个很好的做法,而不仅仅是解决我的问题。我将把它更多地作为一种安全措施来实现,但我发现了问题,在我的缓冲区(字节数组)大小中它是一个固定的 1MB 值,这会损坏文件,我改为 5MB 并工作,以防止这种情况再次发生我会在 web.config 中设置一个参数或者获取 maxReceivedMessageSize 来设置这个值。
  • 您可以回答自己的问题,甚至鼓励。如果你这样做,其他有同样问题的人会找到你的解决方案

标签: .net wcf


【解决方案1】:

因此,如果有人遇到同样的问题,请检查您的缓冲区大小。 我正在使用这种形式的阅读流:

Dim buffer As Byte() = New Byte(1000000) {}
Dim bytes_read As Integer = 0
Dim bytes_total As Integer = 0
Do
    bytes_read = invoice_stream.Read(buffer, 0, buffer.Length)
    bytes_total += bytes_read
Loop While bytes_read > 0

我将网络配置设置为 5MB,但我的缓冲区大小只有 1MB,这就是为什么我在尝试上传大于 1MB 的文件时文件损坏或损坏的原因。 令人困惑的部分是当保存的文件与原始文件的大小相同时,这是因为我使用这一行来调整字节数组的大小,这样我就不会总是得到一个 5MB 的文件:

Array.Resize(buffer, bytes_total)

所以基本上我只存储了流的最后一部分或最后 1MB 以及一堆零来完成原始大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    相关资源
    最近更新 更多