WCF利用Stream上传大文件

from :  http://www.chibaohua.com/article.asp?id=323

 

本文展示了在asp.net中利用wcf的stream方式传输大文件,解决了大文件上传问题。主要是存档方便以后遇到该问题是来查阅。贴出部分代码,如果有疑惑或需要完整代码的请留言
Test.ASPX.CS


protected void Button3_Click(object sender, EventArgs e)
        {
            FileData file = new FileData();
            file.filename = FileUpload1.FileName;
            file.data = new FileStream(FileUpload1.PostedFile.FileName, FileMode.Open);
            GetDataServiceClient c = new GetDataServiceClient();
            c.UploadFile(file.filename, file.data);
            Response.Write("文件传输成功!");
            c.Close();
            
        }


Contract

 程序代码

[ServiceContract]
    public interface IGetDataService
    {
        [OperationContract]
        void UploadFile(FileData file);
   }
[MessageContract]
    public class FileData
    {
        [MessageHeader]
        public string filename;
        [MessageBodyMember]
        public Stream data;
    }


ServiceLib

 程序代码

  public class GetDataService : IGetDataService
    {
public void UploadFile(FileData file)
        {
            FileStream fs = new FileStream("Files//"+file.filename, FileMode.OpenOrCreate);
            try
            {

                BinaryReader reader = new BinaryReader(file.data);
              
                byte[] buffer;

                BinaryWriter writer = new BinaryWriter(fs);
                long offset = fs.Length;
                writer.Seek((int)offset, SeekOrigin.Begin);

                do
                {

                    buffer = reader.ReadBytes(1024);

                    writer.Write(buffer);

                } while (buffer.Length > 0);

              

            }
            catch(Exception e)
            {

            }
            finally
            {

                fs.Close();
                file.data.Close();

            }

        }
    }


App.config

 程序代码

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <services>
            <!--name - 提供服务的类名-->
            <!--behaviorConfiguration - 指定相关的行为配置-->
            <service name="ServiceLib.GetDataService" behaviorConfiguration="BindingBehavior">
                <!--address - 服务地址-->
                <!--binding - 通信方式-->
                <!--contract - 服务契约-->
                <!--<endpoint binding="basicHttpBinding" contract="WCF.ServiceLib.Binding.IHello" address="Hello" />-->
                <!--元数据交换的endpoint-->
                <!--注:address是mex,它会和host/baseAddresses节点中的baseAddress做拼接,即提供元数据交换的地址为: http://localhost:12345/Binding/mex-->
                <endpoint binding="basicHttpBinding" bindingConfiguration ="DocumentExplorerServiceBinding" contract="Contract.IGetDataService" address="mex" />
                <host>
                    <baseAddresses>
                        <add baseAddress=" http://localhost:8008/"/>
                    </baseAddresses>
                </host>
                
            </service>
            
        </services>
        
        <behaviors>
            <serviceBehaviors>
                <behavior name="BindingBehavior">
                    <!--httpGetEnabled - 使用get方式提供服务-->
                    <serviceMetadata httpGetEnabled="true" />
                </behavior>
              
            </serviceBehaviors>
        </behaviors>
        <bindings>
            <basicHttpBinding>
                <binding name="DocumentExplorerServiceBinding"
                    sendTimeout="00:10:00"
                    transferMode="Streamed"
                    maxReceivedMessageSize="9223372036854775807">
                </binding>
            </basicHttpBinding>
              
        </bindings>
    </system.serviceModel>
    
</configuration>


web.config

 程序代码

<system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IGetDataService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    transferMode="Streamed"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address=" http://192.168.0.19:8008/mex" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IGetDataService" contract="IGetDataService"
                name="BasicHttpBinding_IGetDataService" />
        </client>
    </system.serviceModel>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值