我的WCF服务合同必须包含以下方法:
[OperationContract]
string GetFile(int id);
[OperationContract]
void UploadFile(int id, string text);
GetFile返回文件的文本,UploadFile将一些文件的内容发送到服务器。
有一个奇怪的行为,当文件的大小大约几MB(在我的情况下为4.37 MB):GetFile工作正常,客户端获取长文本没有任何问题,但UploadFile无法发送相同的文件到服务器。客户端在执行此方法时冻结,似乎无法完成操作。我等了几分钟,但没有结果,我强行停止了客户。
所以,我的问题是这种转移的方向有什么不同吗?我知道WCF流,它应该用于将大文件发送到服务器,我将使用它来更改我的代码。我想知道为什么只有在服务器正确返回相同大小的数据时将文件传输到服务器时才会出现问题?
更新。 UploadFile不应该是OneWay操作,因为我需要知道它是否成功。 执行不丰富服务器。我在服务器端设置了断点,它不会触发。
答案 0 :(得分:2)
我猜你已经在服务器和客户端上配置了maxReceivedMessageSize和reader配额。否则你不应该发送这么大的消息。您是否在IIS中托管WCF服务? Http运行时有自己的限制,即4MB。它可以在configuration/system.web/httpRuntime/@maxRequestLength中更改(值以KB为单位)。我想知道为什么你没有收到任何例外。
答案 1 :(得分:1)
客户端是否可能只是等待UploadFile
返回?
你可以做的一件事是在单独的pass上激活UploadFile方法调用,这样你就不会阻止UI线程(假设你所说的客户端是一个GUI应用程序)。
可能值得将UploadFile
的OperationContract设置为[OperationContract(IsOneWay = true)]
,以便客户端不会等待服务器响应。即使返回类型UploadFile
无效,服务器仍将以空消息响应,除非IsOneWay
设置为true。正如拉迪斯拉夫所提到的那样,这样做可以给你一种即发即弃的行为,你不会在处理你的电话时发现服务器是否排除。