WCF从服务器传输大文件,反之亦然

WCF从服务器传输大文件,反之亦然,wcf,file,transfer,Wcf,File,Transfer,我的WCF服务合同必须采用以下方法: [OperationContract] string GetFile(int id); [OperationContract] void UploadFile(int id, string text); GetFile返回文件的文本,UploadFile将一些文件的内容发送到服务器 有一种奇怪的行为,当文件大小约为几MB(在我的例子中为4.37 MB)时:GetFile工作正常,客户端可以毫无问题地获取长文本,但Uploa

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

    [OperationContract]
    string GetFile(int id);

    [OperationContract]
    void UploadFile(int id, string text);
GetFile返回文件的文本,UploadFile将一些文件的内容发送到服务器

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

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

更新。上传文件不应该是单向操作,因为我需要知道它是否成功。
执行不会丰富服务器。我在服务器端设置了断点,但它不会触发。

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

客户端是否只是在等待
上传文件返回

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


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

但是如果你设置IsOneWay=true,你将永远不会知道上传是否成功。@Ladislav-这是真的,但通常你并不在意,只是想先发后忘,从这个问题上我真的说不出这个建议。我想应该已经提到了,更新了我的回答如果宿主应用程序拒绝了请求,你的断点自然不会被击中。请求没有被拒绝,它不会到达服务器。这正是我要建议的!