C# WCF服务流字节数组大小问题

C# WCF服务流字节数组大小问题,c#,wcf,C#,Wcf,我有一个返回流对象的WCF服务。但由于某些原因,我得到了一个损坏的zip文件,我正在对其进行流式处理。所有代码如下,请告知 合同代码 [ServiceContract(Namespace = "http://schemas.acme.it/2009/04/01")] public interface IFileTransferService { [OperationContract(IsOneWay = false)] FileDownloadReturnMessage Down

我有一个返回流对象的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>

缓冲区大小无关紧要,只需选择一个合理的大小,如:

Byte[] buffer = new Byte[8192];
代码中还有一个错误,您在其中写入缓冲区的内容:

outStream.Write(buffer, 0, buffer.Length);
应该是:

outStream.Write(buffer, 0, byteRead);

否则,即使缓冲区中只填充了部分数据,您也将始终写入整个缓冲区。

感谢您的回复,我已经按照建议进行了更改,我可以看到我可以下载我的zip文件,但是当我提取它时,我会出错。因此,不确定错误在哪里,是在WCF服务中还是在客户端。我已经用所有代码更新了我的问题。请advise@Amit:问题是您正在将内容长度设置为缓冲区大小。如果可以找到实际的流大小,则可以使用它,否则必须跳过“内容长度”属性。
outStream.Write(buffer, 0, byteRead);