当前位置:首页 » 文件管理 » wcf异步文件上传

wcf异步文件上传

发布时间: 2023-01-31 11:00:16

‘壹’ c#wcf的channelfactory<t>是经过动态编译实现的么

WCF在跨域传输使用了两种模型的方法调用:一种是同步模型,这种模型显然对那些需要大量操作时间的方法调用(如从数据库中获取大量数据时)是一种痛苦的选择。另一种是异步模型的方法调用,这种模型是一种非阻塞方法,其方法调用期间并不等到方法调用结束获得结果才返回,而是方法调用一经开始就马上返回,程序可以继续向前执行,被调用方法和主程序同时执行,在调用方法结束才返回结果。显然这种模型给了我们很好的编程和使用体验。
基于WCF在普通的编码是以文本编码方式在信道之间传输信息的,这种编码会把所有的二进制信息以字节数组的形式存储,并以Base64进行编码,而Base64则是用三个字节来储存4 个字符信息。使得数据量增大约30%以上。在WCF中引入了一种专门针对数据流进行优化编码的MTOM模型。下面我们使用编码模型和调用模型三种方式来改写文件流的传输,以提高WCF应用程序的性能。
1、 MTOM模型:
这模型在于将SOAP消息编码成SOAP MT OM(消息传输优化机制)编码。这种编码是为那些包含大量的二进制数据的SOAP消息而做的,它是把数据流作为SOAP消息的附件而添加的。所以利用这种编码在传输信道之间传输可以显着提高传输性能。在WCF中MTOM模型的操作契约中只能使用单个Stream对象作为参数或者返回类型。
这种模型的特点如图所示:
1.1实现服务契约
服务契约是服务所支持的操作、使用的消息交换模式和每一则消息的格式,它控制消息被格式化的方式,在这里由于要使用MTOM编码消息,所以在操作契约中必须要以单一的Stream对象为输入输出参数。所以这儿我们把服务定义为如下的形式:

[ServiceContract]
public interface ISendStreamService
{
[OperationContract]
void SendStream(Stream stream);
//这个方法的是为了传递文件的参数而设的
[OperationContract]
void FileNameSetting(string filename, string destinationpath);
}
另外我们还定义了一个传输文件路径的名称的辅助方法:FileNameSetting();
1.2实现服务器方法
在上面定义了公共的接口后,接下来我们就实现接口的方法,主要的方法的目的是为了传输Stream对象,由于Stream是一个抽象类,所以这儿以文件流为操作对象来使用SendStream()这个方法。

1.3客户通过接口调用服务器方法
客户端调用服务器方法至少有三种,这里我们选择工厂方法来实现,System.ServiceMode.Channel.ChannelFactory<T>类是这个信道工厂类,它的方法CreateChannel()可以创建T的实例。
ISendStreamService proxy=new
ChannelFactory<ISendStreamService>(“WSHttpBinding_ISendStreamService”).Create-
Channel();
proxy.FileNameSetting(file.Substring (file.LastIndexOf ("\\")+1), filePath);
proxy.SendStream(inStream);
1.4服务器和客户端的配置信息
配置信息定义了双方通信的终结点、绑定、契约行为及其他的配置如安全,可靠性等。服务器的配置如:
<service behaviorConfiguration="SendStreamServiceBehavior"
name="SendStreamService">
<endpoint address=" http://localhost:5504/WebSite2/ISendStreamService "
binding="wsHttpBinding" bindingConfiguration="MTMOBinding"
contract="ISendStreamService">
</endpoint>
<bindings>
<wsHttpBinding>
<binding name="MTMOBinding" messageEncoding="Mtom">
</wsHttpBinding>
</bindings>
</service>

‘贰’ WCF中使用MTOM方式传送文件的问题

应该不需要!~~~

因为上传控件是服务器控件 所有操作都在服务器端进行 客户端只是上付给一个上传的地址而已!

‘叁’ wcf技术能否支持大批量文件传输

支持,只要帮定的协议恰当,对封包大小限制合理,就可以大批量传问题和传大容量文件.
而且WCF支持Stream传输文件.

‘肆’ WCF文件传输出错解决方法怎么解决

nfo不是安装文件.nfo全称是information(信息)
是一个向readme.txt的说明文档
实际上他的历史要比readme要久远的多
一般是游戏制作商或代理商发的,里面有一些基本的信息,还有一些有趣的文字符号拼图
好多东西都有nfo文档,像电影...
你要玩游戏的话,跟那个没多大关系的.
你要想看下一个叫做DAMN_NFO_Viewer_的软件看.
还有win7好多游戏不兼容啊,用win7要放弃好多优秀的游戏啊

‘伍’ silverlight将数据传到WCF,由WCF将数据导入到word、excel,,然后将文件传回到客户端,求高手啊

代码已发送到你的邮箱,请采纳,谢谢!

‘陆’ Silverlight+WCF 如何实现文件上传和下载功能

WCF上传一次只能传16K,速度不理想,理想的方案是使用HTTP上传,可以参照这个开源项目:http://slfileupload.codeplex.com/

‘柒’ C# WCF与数据库如何连接到winform程序上

wcf 30rmb帮写 私信

‘捌’ Web Service和WCF的到底有什么区别

Web Service是早期的技术实现了,也是soap的东西,采用的主要是http协议,假如是在C#上开发的话,需要寄宿在IIS上来实现。

WCF的话是相对较新的技术,里面的basichttpbinding可以跟以前的ws进行通信,并且集成了大部分的通信协议(几种http协议的实现以及net.Tcp实现、msmq、命名管道等实现),另外寄宿的宿主可以是命令行控制台、IIS、桌面程序等。

差别的话,感觉有这以下几点[针对C#来说的]。

  1. ws的话,编程模型没有wcf的那么好,具体的实现差别建议网络下,个人觉得wcf比较好。wcf可以用契约的接口方式来进行实现,而ws的话主要是通过继承WebService的类来实现的,方法上添加WebMethod特性,WCF的话是通过服务契约来声明(可以是接口也可以是类对象)

  2. ws的话通用性比较强,跟java等ws也可以进行互相通信,然后假如是wcf发布的服务,除了basicHttpBinding这种绑定之外,其余的几种绑定基本上不能作为互相通信。例如命名管道跟net.Tcp都是,值得说的是这里的net.Tcp跟原生的tcp是不一样的,内部实现上参考tcp的可靠连接机制进行了应用层的一套实现。

  3. 另外一点就是服务引用跟web引用上的,这个严格来说不能属于两者的区别,只是.net版本的区别,主要是针对客户端对服务端发布好的服务进行的引用,服务引用生成的时候,会在配置文件上存在一份配置项,可以进行ABC终结点的配置,假如是web引用的话,会在setting中添加上一个硬编码的地址。建议用服务引用。

  4. 还有一个就是客户端调用服务端开发的时候,webservice的话,基本上只能通过服务端发布的地址来进行引用[应用的方式可以参考点3],或者通过服务端提供的wsdl文件来进行引用(该种方式一般比较少,因为需要提供文件,而不是通过公开的方式来进行接口的提供,无法应对服务变更后发布问题,但是确实有这个情况的存在)。而wcf的话,还存在可以通过提供契约文件(就是声明了ServiceContract的那个接口文件)来进行服务的调用。

  5. 在接口层面的话,凡是IList<class T>以及IDictionary<class T>这一类的泛型实现都会在进行服务引用的时候,都会转换为数组的,例如void F(IList<int>)会在引用后成为void F(int[])这种方式,而才用点4提供的契约文件的话就能保持方法的原始声明。

个人建议的话,假如是新开发的系统基本上都才用wcf比较好,一个是接口的思想,一个是假如需要转换为其他协议的话可以比较方便,只需要通过配置文件修改下就可以[当前前提是没有用到特定协议的特定属性,例如服务回调,有些协议是不支持双向通信的]。而且也需要考虑发布的服务是否需要公开给别的语言进行通信。


另外楼上说的性能在下降的话,我大概说明下:

基本上针对应用的开发都是基于socket的开发,传统的socket开发的话,是需要自己去实现整个通信框架的,包括多线程处理,IOCP等的实现[基本上.net的异步通信模型在内部实现都会绑定好,IOCP是一个异步模型,自行网络],二进制流的编码处理[网络传输都是通过二进制的,例如utf8到二进制的转换],tcp无边界消息的处理[udp的话没有这个,但是包体的大小也是有限制],通信协议的约定处理[例如ws跟wcf是采用soap这种,各种ws的约定,例如多少个字节表示数据流的长度、数据的检验,还是数据加密位,也包括数据的位移处理],数据上抛模型跟数据回复模型[接受到数据后是需要上抛给业务层去进行处理的,然后也需要回复给客户端,不过也不一定是这样,看需求],还有各种针对性的处理,例如客户端socket的保存[有可能对长期不适用的套接字要进行自动断开的业务]。类似wcf这种东西的话,还有序列化跟反序列化的情况[序列化跟反序列化是性能开销比较大的,例如序列化是通过反射来实现的,反射又是跟程序集的元数据有关的,属于运行时行为],假如是自己实现tcp通信模型,就不一定会有序列化跟反序列化的通信模型了,而且wcf为了让通信跟本地调用那样以及标准的方面,字节流都是比较大的,这里也会增加通信的带宽【好比自定义的协议4个字节的数据包长度+1个字节的加密压缩位+N个数据包位+X个字节的检验位,这种的话实际用到的字节就比较少了,因为在数据包里面,可以会用2个字节表示协议头,例如ox0A表示登录接口,再用4个字节表示登录名,4个字节表示密码等】。以上是简单的对socket跟wcfws等协议的差别说明。socket跟wcfws对比的话,socket性能是最高的,高并发高响应的时候,这里是有差距的,技术上的话,socket需要更加多的技术支持[开发周期长,对人员要求高],而wcf在应用层面上基本无难度,就是一些配置,出现问题也大部分可以通过网络来处理。另外一个就是托管语言本身的问题,GC这块的,GC回收的时候,是需要挂起堆栈上的线程的,而且GC的线程优先级比你所能创建的所有线程的优先级都要高,等GC执行完毕的时候才能去执行你的线程,wcf在堆对象上申请的空间也会更加多,自然导致GC会受到的概率也会更加大,这里也会可能导致wcf性能不如socket。基本上来说,C#的类都是引用对象,都是堆申请的,在引用计数超出的时候,都会被下一个GC[]操作去回收,真是个奇葩的事情。


总之,在ws跟wcf之间选择的话,个人觉得优先选择wcf好点。

如果是对性能要求较高[高并发等],或者是长连接再或者是需要用到UDP这种的话,就基本上无法用wcf跟ws这种了,wcf是没有udp协议的,http协议也只是在tcp协议下的上层协议,底层发送的数据包跟实作是不通的。另外对于长连接,虽然wcf提供了类似回调这种情况机制,只是个人不推荐使用在这种长连接的场合下。


纯手打,哎,晚上睡不着。。。。 楼主采纳了吧

‘玖’ 基于TCP协议的WCF传输大文件怎么出现进度条

基于TCP协议的WCF传输大文件如何出现进度条
RT.
比如传输50M的文件,
我能显示个进度条 2000Kb of 5000Kb 已传输40%.
有回复了加分.

------解决方案--------------------
不建议用WCF做文件传输
参考以下代码(VS2008下测试通过)
Service端:
C# codeusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.IO;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Description;
using System.ServiceModel.Channels;
namespace FSDownloadService
{
[MessageContract]
public class MyFileInfo
{
[MessageHeader]
public string FileName;
[MessageHeader]
public long FileSize;
[MessageBodyMember]
public Stream Stream;
public MyFileInfo() { }
public MyFileInfo(Stream stream, string fileName, long fileSize)
{
this.Stream = stream;
this.FileSize = fileSize;
this.FileName = fileName;
}
}

[MessageContract]
public class DownloadFileRequest
{
[MessageBodyMember]
public readonly string FileName;
public DownloadFileRequest() { }
public DownloadFileRequest(string fileName)
{
this.FileName = fileName;
}
}
[ServiceContract]
public interface IFileManager
{
[OperationContract]
MyFileInfo DownloadFile(DownloadFileRequest request);
}
[ServiceBehavior( = true)]
public class MyService : IFileManager
{
public MyFileInfo DownloadFile(DownloadFileRequest request)
{
FileInfo fi = new FileInfo(request.FileName);
MyFileInfo result = new MyFileInfo(File.OpenRead(request.FileName), request.FileName, fi.Length);
return result;
}
}

public class MyHost
{
static ServiceHost host = null;
public static void Open()
{
string baseAddress = "net.tcp://localhost:2008/FileService";
host = new ServiceHost(typeof(MyService), new Uri(baseAddress));
host.AddServiceEndpoint(typeof(IFileManager), GetTcpBinding(), "");
host.Open();
}
public static void Close()
{
if (host != null && host.State == CommunicationState.Opened)
{
host.Close();
}
host = null;
}
public static Binding GetTcpBinding()
{
NetTcpBinding binding = new NetTcpBinding();
binding.TransferMode = TransferMode.Streamed;
binding.MaxReceivedMessageSize = int.MaxValue;
return binding;
}
}
}

‘拾’ 如何将WCF服务发布到IIS中去VS2010版

第一步,我们在刚刚创建完的解决方案里,再添加一个WebApplication的项目取名叫做“WebServicePerson”

第二步,给WebServicePerson这个项目添加一个.SVC的文件,取名叫做“PersonService”

接下来呢,将创建项目时自带的文件夹和.aspx文件都删除掉(如下图)然后打开 PersonService.svc 文件,我们需要将文件修改如下。

<% @ ServiceHost Language = "C#" Debug = "true" Service = "WCFService_Library2010.PersonService" %>

Service = "WCFService_Library2010.PersonService"是需要自己定义的,服务指向那个WCF的服务库

第三步,非常重要绝对不能忽略,就是要将WCF服务引用到当前的项目中来。

第四步,经过上面三步的操作项目基本已成成型了,接下来只需要最后一步了,那就是配置Web.Config. 自己手写去配置Web.config是非常痛苦的,所幸微软给我我们提供了非常便捷的配置功能“Edit WCF Configuration”

进入配置界面后,我们发现Services下面并没有任何节点,需要我们自己去新建一个,可以点击“Create a New Service...”去创建
去选择,我们刚刚创建的 WCF Service Library的服务。


一路next往下。
这一步很重要的,因为之前我们已经添加了一个.svc的文件PersonService并且已经配置好了Service的内容,所以系统自动已经在Service Behaviors下面创建了一个PersonService的节点。

热点内容
服务器提供什么服务 发布:2024-05-06 21:45:20 浏览:211
一汽桌面云服务器地址 发布:2024-05-06 21:19:23 浏览:996
北京市社保官网登录密码是什么 发布:2024-05-06 21:19:15 浏览:380
c语言数组的删除 发布:2024-05-06 20:52:33 浏览:398
机械战警用什么配置好看 发布:2024-05-06 20:27:12 浏览:435
win10添加python环境变量 发布:2024-05-06 20:27:12 浏览:313
并联臂算法 发布:2024-05-06 20:02:11 浏览:623
cf跟dnf哪个需求配置高 发布:2024-05-06 20:01:23 浏览:657
什么配置皮筋能打老鼠吗 发布:2024-05-06 19:54:32 浏览:742
压缩机油压差报警 发布:2024-05-06 19:45:08 浏览:336