WCF利用Stream上传大文件

本文展示了在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>


文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
相关日志:
评论: 10 | 引用: 0 | 查看次数: 2793
回复回复学习一下[2010-08-30 11:14 AM | del]
新人学习WCF,求源代码一份,谢谢楼主了!
95487486@qq.com
回复来自 风水先生 的评论 风水先生 于 2010-08-31 08:12 AM 回复
已发
回复回复学习一下[2010-08-30 11:13 AM | del]
新人学习WCF,求源代码一份,谢谢楼主了!
回复回复cmcc[2010-08-24 12:35 AM | del]
能给我一份源码吗? jsyzthz@gmail.com
回复来自 风水先生 的评论 风水先生 于 2010-08-26 08:29 AM 回复
已发
回复回复cappuccino[2010-08-06 03:17 PM | del]
博主能给我发一份吗?正需要,谢谢!
newcheese@sina.com
回复来自 风水先生 的评论 风水先生 于 2010-08-18 06:01 PM 回复
已发送
回复回复学习[2010-07-26 04:05 PM | del]
楼主,我想要份源码不知道可以不,我的邮箱:chnm@qq.com。谢谢。
回复来自 风水先生 的评论 风水先生 于 2010-07-27 08:18 AM 回复
已发,请查收
回复回复walker[2010-07-02 08:35 PM | del]
正是需要的,麻烦发一份源码,我邮箱daywalkeone@sina.com,谢谢
回复来自 风水先生 的评论 风水先生 于 2010-07-05 08:24 AM 回复
已发,请查收
回复回复ermo[2010-06-17 12:09 AM | del]
麻烦给发给我一份,谢谢
ermo.guan@gmail.com
回复回复ilv[2010-06-07 09:01 AM | del]
能不能给我发一份源代码,谢谢!
devinying@hotmail.com
回复来自 风水先生 的评论 风水先生 于 2010-06-07 11:26 AM 回复
已发,请查收
回复回复dong[2010-03-26 05:41 PM | del]
可以给我发份!谢谢!邮箱:dong_1984@yeah.net
回复回复nywh[2009-06-13 08:08 PM | del]
您好,请问怎么样才能使服务端的这个 uploadfile函数 有返回值 好让我知道到底有没有上传成功呢 ?
我的邮箱nywh@163.com
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭