我有一个返回流对象的WCF服务。但由于某种原因,我得到了一个损坏的zip文件,我正在流媒体。所有代码都在下面请告知
合同代码
[ServiceContract(Namespace = "http://schemas.acme.it/2009/04/01")]
public interface IFileTransferService
{
[OperationContract(IsOneWay = false)]
FileDownloadReturnMessage DownloadFile(FileDownloadMessage request);
[OperationContract()]
string HellowWorld(string name);
}
[MessageContract]
public class FileDownloadMessage
{
[MessageHeader(MustUnderstand = true)]
public FileMetaData FileMetaData;
}
[MessageContract]
public class FileDownloadReturnMessage
{
public FileDownloadReturnMessage(FileMetaData metaData, Stream stream)
{
this.DownloadedFileMetadata = metaData;
this.FileByteStream = stream;
}
[MessageHeader(MustUnderstand = true)]
public FileMetaData DownloadedFileMetadata;
[MessageBodyMember(Order = 1)]
public Stream FileByteStream;
}
[DataContract(Namespace = "http://schemas.acme.it/2009/04/01")]
public class FileMetaData
{
public FileMetaData(string [] productIDs, string authenticationKey)
{
this.ids = productIDs;
this.authenticationKey= authenticationKey;
}
[DataMember(Name = "ProductIDsArray", Order = 1, IsRequired = true)]
public string[] ids;
[DataMember(Name = "AuthenticationKey", Order = 2, IsRequired = true)]
public string authenticationKey;
}
SVC文件代码
public class DownloadCoverScan : IFileTransferService
{
public FileDownloadReturnMessage DownloadFile(FileDownloadMessage request)
{
FileStream stream = new FileStream(@"C:\Pictures.zip", FileMode.Open, FileAccess.Read);
FileMetaData metaData= new FileMetaData(new string[] { "1", "2" },"asd");
FileDownloadReturnMessage returnMessage = new FileDownloadReturnMessage(metaData,stream);
return returnMessage;
}
public string HellowWorld(string name)
{
return "Hello " + name;
}
}
配置代码
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="DownloadCoverScanBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true" httpHelpPageEnabled="true" />
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="DownloadCoverScanBehavior" name="DownloadService.DownloadCoverScan">
<endpoint address="" name="basicHttpStream" binding="basicHttpBinding" bindingConfiguration="httpLargeMessageStream"
contract="DownloadService.IFileTransferService" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="httpLargeMessageStream" maxReceivedMessageSize="2147483647" transferMode="Streamed" messageEncoding="Mtom" />
</basicHttpBinding>
</bindings>
</system.serviceModel>
客户代码
FileMetaData metaData = new FileMetaData();
metaData.ProductIDsArray = new string[] { "1", "2" };
metaData.AuthenticationKey = "test";
FileDownloadMessage inputParam = new FileDownloadMessage(metaData);
FileTransferServiceClient obj = new FileTransferServiceClient();
FileDownloadReturnMessage outputMessage = obj.DownloadFile(inputParam);
Byte[] buffer = new Byte[8192];
int byteRead = outputMessage.FileByteStream.Read(buffer, 0, buffer.Length);
Response.Buffer = false;
Response.ContentType = "application/zip";
Response.AppendHeader("content-length", buffer.Length.ToString());
Response.AddHeader("Content-disposition", "attachment; filename=testFile.zip");
Stream outStream = Response.OutputStream;
while (byteRead > 0)
{
outStream.Write(buffer, 0, byteRead);
byteRead = outputMessage.FileByteStream.Read(buffer, 0, buffer.Length);
}
outputMessage.FileByteStream.Close();
outStream.Close();
答案 0 :(得分:4)
缓冲区大小并不重要,只需选择合理的大小,如:
Byte[] buffer = new Byte[8192];
您的代码中也存在错误,您可以在其中编写缓冲区的内容:
outStream.Write(buffer, 0, buffer.Length);
应该是:
outStream.Write(buffer, 0, byteRead);
否则,即使只是部分填充了数据,您也总是会写入整个缓冲区。