WCF大数据量传输的详细步骤
1. 新建一个空白解决方案解决方案WcfSolution。
2. 添加一个类库项目DBLibrary
首先添加一个序列化和反序列对象类MySerialize
- ///<summary>
- ///序列化对象
- ///</summary>
- public static byte[] SerializeArray<T>(T DataValues)
- {
- byte[] b;
- // 创建一个内存流
- MemoryStream ms = new MemoryStream();
- try
- {
- // 序列化对象
- BinaryFormatter binaryFormatter =newBinaryFormatter();
- // 将对象序列化为内存流
- binaryFormatter.Serialize(ms, DataValues);
- // 设置内存流的起始位置
- ms.Position = 0;
- // 读入到byte数组
- b = new byte[ms.Length];
- ms.Read(b, 0, b.Length);
- }
- catch (Exceptionex)
- {
- throw ex;
- }
- finally
- {
- ms.Close();
- ms.Dispose();
- }
- return b;
- }
- ///<summary>
- ///反序列化对象
- ///</summary>
- public static TDeserializeArray<T>(byte[] DataValues)
- {
- T MyDataValues;
- // 创建一个内存流
- MemoryStream ms = new MemoryStream();
- try
- {
- // 序列化对象
- BinaryFormatter binaryFormatter =newBinaryFormatter();
- // 将byte数组到内存流
- ms.Write(DataValues, 0, DataValues.Length);
- // 将内存流的位置到最开始位置
- ms.Position = 0;
- // 反序列化成对象,创建出与原对象完全相同的副本
- MyDataValues = (T)binaryFormatter.Deserialize(ms);
- }
- catch (Exceptionex)
- {
- throw ex;
- }
- finally
- {
- ms.Close();
- ms.Dispose();
- }
- return MyDataValues;
- }
其二 添加一个数据结构类DBData(可以根据具体要求来声明)
- [Serializable]
- public class DBData
- {
- public double BeginTime;
- public IList<double> TimeSpan;
- }
其三 添加一个组织数据类DBHelp
- public classDBHelp
- {
- ///<summary>
- ///序列化对象
- ///</summary>
- public static DBData GetData()
- {
- return new DBData(); // 具体数据自己添加
- }
- }
3. 在WcfSolution中添加一个类库Services,主要是用于定义契约。
添加一个IGetByte接口
- ///<summary>
- ///服务契约
- ///</summary>
- [ServiceContract(Name = " IGetByte ",Namespace ="http://www.weifangyh.com")]
- public interface IGetByte
- {
- [OperationContract]
- byte[]GetDBData();
- }
添加一个GetByte类,实现IGetByte接口
- public class GetByte: IGetByte
- {
- public byte[]GetDBData()
- {
- DBData db = newDBHelp.GetData();
- return MySerialize.SerializeArray(db);
- }
- }
4. 在WcfSolution中添加一个控制台应用程序Host,主要作用是作为启动wcf程序的宿主。
一.添加一个app.config用来配置服务器设置
- <?xmlversionxmlversion="1.0"?>
- <configuration>
- <system.serviceModel>
- <bindings>
- <basicHttpBinding>
- <bindingnamebindingname="basehttpbinding" transferMode="Streamed"maxBufferSize="2147483647"maxReceivedMessageSize="2147483647"messageEncoding="Text">
- <readerQuotasmaxDepthreaderQuotasmaxDepth="32"maxStringContentLength="2147483647"maxArrayLength="2147483647"
- maxBytesPerRead="2147483647"maxNameTableCharCount="2147483647" />
- </binding>
- </basicHttpBinding>
- </bindings>
- <services>
- <servicenameservicename="Services.GetByte"behaviorConfiguration="serviceBehavior">
- <endpointaddressendpointaddress="GetByte" binding="basicHttpBinding"contract="Services.IGetByte">
- </endpoint>
- <endpointaddressendpointaddress="mex"binding="mexHttpBinding"contract="IMetadataExchange"/>
- <host>
- <baseAddresses>
- <addbaseAddressaddbaseAddress="http://localhost:8050"/>
- </baseAddresses>
- </host>
- </service>
- </services>
- <!--这个节使用来配置服务的行为-->
- <behaviors>
- <serviceBehaviors>
- <behaviornamebehaviorname="serviceBehavior">
- <!--指定元数据使用http的get方式获取-->
- <serviceMetadatahttpGetEnabledserviceMetadatahttpGetEnabled="true"/>
- <dataContractSerializermaxItemsInObjectGraphdataContractSerializermaxItemsInObjectGraph="2147483647"/>
- </behavior>
- </serviceBehaviors>
- </behaviors>
- </system.serviceModel>
- <startup><supportedRuntimeversionsupportedRuntimeversion="v4.0"sku=".NETFramework,Version=v4.0"/></startup></configuration>
二.在Main方法中写启动服务代码
- static void Main(string[]args)
- {
- ServiceHost host = newServiceHost(typeof(GetProductssList));
- host.Open();
- Console.WriteLine("服务已启动!");
- }
5. 在WcfSolution中添加一个asp.net网站当作客户端。
先把Host宿主运行起来,网站中右键添加服务引用,在地址中输入服务地址http://localhost:8050/GetByte前往然后确定
自动生成web.config配置文件,在这里需要修改些配置,以实现接受大数据量,配置文件如下:
- <system.serviceModel>
- <behaviors>
- <endpointBehaviors >
- <behaviornamebehaviorname="ClientBehavior">
- <dataContractSerializermaxItemsInObjectGraphdataContractSerializermaxItemsInObjectGraph="2147483647" />
- </behavior>
- </endpointBehaviors>
- </behaviors>
- <bindings>
- <basicHttpBinding>
- <bindingnamebindingname="BasicHttpBinding_GetByte"closeTimeout="00:01:00"
- openTimeout="00:01:00"receiveTimeout="00:10:00"sendTimeout="00:10:00"
- allowCookies="false"bypassProxyOnLocal="false"hostNameComparisonMode="StrongWildcard"
- maxBufferSize="2147483647"maxBufferPoolSize="2147483647"maxReceivedMessageSize="2147483647"
- messageEncoding="Text"textEncoding="utf-8"transferMode="Streamed"
- useDefaultWebProxy="true">
- <readerQuotasmaxDepthreaderQuotasmaxDepth="2147483647"maxStringContentLength="2147483647"
- maxArrayLength="2147483647"maxBytesPerRead="2147483647"maxNameTableCharCount="2147483647" />
- <securitymodesecuritymode="None">
- <transportclientCredentialTypetransportclientCredentialType="None"proxyCredentialType="None"
- realm="" />
- <messageclientCredentialTypemessageclientCredentialType="UserName"algorithmSuite="Default" />
- </security>
- </binding>
- </basicHttpBinding>
- </bindings>
- <client>
- <endpointaddressendpointaddress="http://localhost:8050/ GetByte "
- binding="basicHttpBinding"bindingConfiguration="BasicHttpBinding_ GetByte"
- contract="ServiceReference_ GetByte.GetByte "
- name="BasicHttpBinding_ GetByte" />
- </client>
- </system.serviceModel>
然后新建page页面,在代码中实现与服务通信获取数据
- GetByteClient getListClient =newGetByteClient ();
- DBData db= MySerialize. DeserializeArray< DBData> (getListClient.GetDBData())
一切搞定,如有疑问欢迎留言