WCF Потоковая ошибка (квота максимального размера сообщения) - PullRequest
0 голосов
/ 20 июня 2011

У меня есть библиотека службы WCF с этим конфигом:

<basicHttpBinding>
   <binding name="httpLargeMessageStream" 
        maxReceivedMessageSize="2147483647"      
        messageEncoding="Mtom" transferMode="Streamed" />
</basicHttpBinding>

<netTcpBinding>
    <binding name="tcpLargeMessageStream" transferMode="Streamed" 
             maxReceivedMessageSize="2147483647" />
</netTcpBinding>

и со стороны клиента, если я отправлю запрос на загрузку файла, то все будет нормально работать

public void UploadFile(FileUploadMessage request)
{
   try
   {
      // Gets absolute local storing path 
      string localPath = Path.Combine(basePath, request.UploadMetadata.StoringPath);

      // Create folders in they don't exist
      FileInfo file = new System.IO.FileInfo(localPath);
      file.Directory.Create();

      // Get document path on server
      string serverFileName = Path.Combine(localPath, request.UploadMetadata.HashFileName);

      // Create a new temp document 
      using (FileStream outfile = new FileStream(serverFileName, FileMode.Create))
      {
         // Read buffer
         const int bufferSize = 65536;

         // Output buffer 
         Byte[] buffer = new Byte[bufferSize];
         int bytesRead;

         // Write bytes from source into local file
         while ((bytesRead = request.FileByteStream.Read(buffer, 0, bufferSize)) > 0)
         {
            outfile.Write(buffer, 0, bytesRead);
         }
      }
   }
   catch (IOException e)
   {
      throw new FaultException<IOException>(e);
   }
}

но для запроса на загрузку я уже получил ошибку:

Максимальная квота размера сообщения для входящих сообщений (65536) было превышены. Чтобы увеличить квоту, используйте свойство MaxReceivedMessageSize на соответствующий обязательный элемент.

public FileDownloadReturnMessage DownloadFile(FileDownloadMessage request)
{
   try
   {
      controlServerAdress = "http://localhost:8080/ControlServer/";

      EndpointAddress basicBinding = new EndpointAddress(controlServerAdress + "TokenService/basic");
      tokenService = new TokenServiceClient("BasicHttpBinding_ITokenService", basicBinding);

      // Get file token form control server
      ComDocFile file = tokenService.ResolveToken(request.DownloadMetadata.Token);

      // If exist file for token
      if (file != null)
      {
         // Get document path on server
         string serverFileName = Path.Combine(basePath, file.FilePath, file.FileName);

         // Set fileName 
         request.DownloadMetadata.FileName = file.FileName;

         // Return file stream
         return new FileDownloadReturnMessage(new FileStream(serverFileName, FileMode.Open, FileAccess.Read), new ReturnDownloadMetaData(file.FileName, true));
      }

      return new FileDownloadReturnMessage(null,
                    new ReturnDownloadMetaData(null, false));
   }
   catch (IOException e)
   {
      throw new FaultException<IOException>(e);
   }
}

Метод вызова клиента:

 // Read buffer
 const int bufferSize = 65536;

 // Output buffer 
 Byte[] buffer = new Byte[bufferSize];
 int bytesRead;

 // Prepare download stream
 Stream donwloadStream;

 ReturnDownloadMetaData file = fileClient.DownloadFile(downloadMetaData, out donwloadStream);

 // If file server return valid file stream
 if (file.IsValid)
 {
    // Create a new temp document 
    using (FileStream outfile = new FileStream("C:\\#ComDocs_FileServer\\" + file.FileName, FileMode.Create))
    {
       // Write bytes from source into local file
       while ((bytesRead = donwloadStream.Read(buffer, 0, bufferSize)) > 0)
       {
          outfile.Write(buffer, 0, bytesRead);
       }
    }
 }

Ответы [ 2 ]

4 голосов
/ 20 июня 2011

maxReceededMessageSize - это размер данных, которые получатель готов принять.В приведенном выше коде для загрузки клиент является получателем.Вам также необходимо увеличить maxReceededMessageSize в клиенте (вы, похоже, не делаете этого из кода, который вы показали)

0 голосов
/ 30 сентября 2015

Используйте это

maxBufferSize = "2147483647" maxReceivedMessageSize = "2147483647"

на стороне отправителя и получателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...