2

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

    [OperationContract]
    string GetFile(int id);

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

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

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

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

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

4

2 回答 2

2

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

于 2010-08-19T09:37:59.737 回答
1

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

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

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

于 2010-08-19T12:53:07.903 回答