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>