【问题标题】:WCF large file transfer from a server and vice-versa从服务器传输 WCF 大文件,反之亦然
【发布时间】:2010-08-19 08:59:15
【问题描述】:

我的 WCF 服务合同必须使用以下方法:

    [OperationContract]
    string GetFile(int id);

    [OperationContract]
    void UploadFile(int id, string text);

GetFile 返回文件的文本,UploadFile 将一些文件的内容发送到服务器。

当文件大小约为几 MB(在我的情况下为 4.37 MB)时,有一个奇怪的行为:GetFile 工作正常,客户端可以毫无问题地获取长文本,但 UploadFile 无法发送 相同 文件到服务器。客户端在执行此方法时冻结,并且似乎不会完成操作。我等了几分钟,但没有结果,我强行停止了客户端。

那么,我的问题是这种转移的方向有什么不同吗?我知道 WCF 流,它应该用于将大文件发送到服务器,我将使用它来更改我的代码。我想知道为什么只有将文件传输到服务器而服务器正确返回相同大小的数据时才会出现问题?

Update. UploadFile 不应该是 OneWay 操作,因为我需要知道它是否成功。 执行不会丰富服务器。我在服务器端设置断点,它没有触发。

【问题讨论】:

  • 如果宿主应用程序拒绝请求,很自然你的断点没有命中。
  • 请求没有被拒绝,它没有到达服务器。

标签: wcf file transfer


【解决方案1】:

我猜你已经在服务器和客户端上配置了 maxReceivedMessageSize 和阅读器配额。否则你应该不能发送这么大的消息。您是否在 IIS 中托管 WCF 服务? Http 运行时有自己的限制,即 4MB。它可以在 configuration/system.web/httpRuntime/@maxRequestLength 中更改(值以 KB 为单位)。我想知道为什么你没有收到任何异常。

【讨论】:

  • 正是我要建议的!
【解决方案2】:

客户端是否有可能只是在等待UploadFile 返回?

您可以做的一件事是在单独的通道上触发 UploadFile 方法调用,这样您就不会阻塞 UI 线程(假设您正在谈论的客户端是一个 GUI 应用程序)。

可能值得将 UploadFile 的 OperationContract 设置为 [OperationContract(IsOneWay = true)],这样客户端就不会等待服务器响应。即使UploadFile 的返回类型是无效的,除非IsOneWay 设置为true,否则服务器仍会以空消息响应。正如 Ladislav 所提到的,这样做会给您一种即发即弃的行为,并且您不会在处理您的呼叫时发现服务器是否异常。

【讨论】:

  • 但是如果你设置 IsOneWay=true 你永远不会知道上传是否成功。
  • @Ladislav - 这是真的,但通常你并不真正关心,只是想开火然后忘记,从这个问题我无法真正说出这个建议。虽然我猜应该提到它,但更新了我的答案
猜你喜欢
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多