使用流和使用mtom,有什么异同?各自的适用场合是什么?
@jillzhang
:)
使用流数据则不用把数据都加载到内存后才传输,减少内存开销
请问使用流数据下载文件怎么实现?可不可以给个例子?
@Teson
和上传没什么区别的
就是server返回一个Stream
然后client把这个Stream写入硬盘
只要理解了上传,那么下载就很容易实现了
@webabcd
上传功能我已经实现了。下载功能会出错。
下面是我的下载服务实现:
public Stream DownloadFile(string pFileName)
{
FileStream fs = null;
try
{
fs = new FileStream(string.Format("FileUploaded\\{0}", pFileName), FileMode.Open);
return fs;
}
catch { }
finally
{
fs.Close();
}
return null;
}
下面是我在客户端的调用:
FileTransferServiceClient fileTransProxy = new FileTransferServiceClient();
this.offlineFileStream = fileTransProxy.DownloadFile(this.fileInfo.FileName);
this.transFileStream = new FileStream(this.sfdTransFile.FileName, FileMode.Create);
while ((recLength = this.offlineFileStream.Read(buffer, 0, buffer.Length)) > 0)
{
try
{
this.transFileStream.Write(buffer, 0, recLength);
writeSize += recLength;
}
catch
{
MessageBox.Show("对方中止文件传输或网络出现异常,文件传输中断。");
break;
}
}
但运行起来会出现以下错误:
The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '00:30:00'.
麻烦看看哪里出问题了,谢谢。
请教一下,为什么要封装成FileWrapper呢,传两个参数应该更简单吧
@Teson
我在我原来上传文件的代码中改了一下,可以正常流数据下载
没有出现你所述的问题啊
@黑白
因为Message Body不能包含其它数据
所以要把其它数据声明为MessageHeader
@Teson
:)
不谢,我也没帮上忙
都是你自己搞定的
请问利用上面上传服务上传文件时怎么样获取文件传输速度和进度?
@Teson
流着写文件很容易知道进度的啊
根据writer了多少buffer就能算出来
@webabcd
我意思是想在客户端调用上传文件服务时,客户端怎么样获取进度?因为在客户端只是把流作为一个参数传给服务,并没有读取文件到buffer啊。
@Teson
服务端知道就行了,然后利用双向通信的特性把进度返回给客户端就好了
@webabcd
我也想过来这样实现的,但是一添加了回调方法就运行出错。是不是使用了流传输的就不能使用双向通信了?
@Teson
没试过,不过应该可以
google一下
有人回答
Streaming is supported under Duplex
你好,我用你的代码,但是上传的时候出现exception,
"套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的。本地套接字超时是“00:04:59.7396256“
请问是什么原因呢?
谢谢,问题已经解决,
我向问下var buffer = new byte[4096];
这里为什么用4096,设置大一些传输速度会不会更快?
@7554753
:)
那就好
缓冲大小,就是在内存中开辟的缓冲
理想条件下设置的大些,会快一些,但是肯定不明显,而且占内存
@Teson
我用了你下载的代码,结果出现和你一样的问题,你怎么解决的?
@webabcd
你好,你有下载代码吗?我还是有问题。
另外我是用WindowsService来host服务,这种host方式如何调式服务呢?我在服务代码里设的断点都进不去,另外两种host方式都没问题。
@webabcd
谢谢webabcd,我知道Teson的代码的问题了。
public Stream DownloadFile(string pFileName)
{
FileStream fs = null;
try
{
fs = new FileStream(string.Format("FileUploaded\\{0}", pFileName), FileMode.Open);
return fs;
}
catch { }
finally
{
fs.Close();
}
return null;
}
以上服务代码代码里不应该调用 s.Close();
@webabcd
有个一问题,WCF服务使用c#写的,而我现在想用c++调用wcf服务该如何做呢。svcutil.exe好像也不能生成c++的代理。