Сбой клиента WCF при получении массива байтов более 350 МБ - PullRequest
0 голосов
/ 28 апреля 2020

Когда я получаю массив байтов размером более 350 МБ, я получаю сообщение об ошибке «Сервер не предоставил значимого ответа; это может быть вызвано несоответствием контракта, преждевременным завершением сеанса или внутренней ошибкой сервера».

Конфигурация на стороне клиента

  var binding = new NetTcpBinding(SecurityMode.None)
        {
            PortSharingEnabled = true,
            MaxBufferSize = Int32.MaxValue,
            MaxReceivedMessageSize = Int32.MaxValue,
            ReaderQuotas = new XmlDictionaryReaderQuotas
            {
                MaxArrayLength = Int32.MaxValue,
                MaxBytesPerRead = Int32.MaxValue,
                MaxDepth = Int32.MaxValue,
                MaxNameTableCharCount = Int32.MaxValue,
                MaxStringContentLength = Int32.MaxValue,
            },

            MaxBufferPoolSize = 0,
            TransactionFlow = false,
            TransactionProtocol = TransactionProtocol.Default,
            TransferMode = TransferMode.Streamed,
            OpenTimeout = new TimeSpan(0, 10, 0),
            CloseTimeout = new TimeSpan(0, 10, 0),
            SendTimeout = new TimeSpan(0, 10, 0),
            ReceiveTimeout = new TimeSpan(0, 10, 0)
        }; 

container.Register(Component.For<IFtpsServiceFacade>()
            .AsWcfClient(
                new DefaultClientModel(
                    WcfEndpoint.BoundTo(binding)
                       .At(string.Format("net.tcp://{0}/FileService.Ftps",
                            "localhost")))
            )); 

Конфигурация на стороне сервера.

var binding = new NetTcpBinding
        {
            PortSharingEnabled = true,
            MaxBufferSize = Int32.MaxValue,
            MaxReceivedMessageSize = Int32.MaxValue,
            ReaderQuotas = new XmlDictionaryReaderQuotas
            {
                MaxArrayLength = Int32.MaxValue,
                MaxBytesPerRead = Int32.MaxValue,
                MaxDepth = Int32.MaxValue,
                MaxNameTableCharCount = Int32.MaxValue,
                MaxStringContentLength = Int32.MaxValue,
            },
            MaxBufferPoolSize = 0,
            TransactionFlow = false,
            TransactionProtocol = TransactionProtocol.Default,
            TransferMode = TransferMode.Buffered,
            OpenTimeout = new TimeSpan(0, 10, 0),
            CloseTimeout = new TimeSpan(0, 10, 0),
            SendTimeout = new TimeSpan(0, 10, 0),
            ReceiveTimeout = new TimeSpan(0, 10, 0)
        }; 
        container.Register(Component.For<IFtpsServiceFacade>()
          .ImplementedBy<FtpsServiceFacade>()
          .AsWcfService(
              new DefaultServiceModel()
                  .AddEndpoints(
                      WcfEndpoint.BoundTo(binding)
                           .At(string.Format("net.tcp://{0}/FileService.Ftps",
                              "localhost"))
                  )).LifestyleSingleton() );

1 Ответ

0 голосов
/ 29 апреля 2020

Для установления канала связи между серверной и клиентской сторонами необходимо, чтобы на стороне сервера и на стороне клиента были установлены одинаковые параметры привязки. Следовательно, произошла вышеуказанная ошибка. Чтобы решить эту проблему, мы должны изменить настройки на стороне сервера, а не на стороне клиента. Максимальный размер поддерживаемого файла выше 2 ГБ, завершается приведенной ниже конфигурацией.

NetTcpBinding binding = new NetTcpBinding();
            binding.Security.Mode = SecurityMode.None;
            binding.MaxBufferSize = Int32.MaxValue;
            binding.MaxBufferPoolSize = Int32.MaxValue;
            binding.MaxReceivedMessageSize = Int32.MaxValue;

Особенно в режиме безопасности, он должен полностью соответствовать настройке, расположенной на стороне клиента. Не стесняйтесь, дайте мне знать, если проблема все еще существует.

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