Я пишущий Сервису WCF, который должен передать большие файлы, таким образом, я потоковая передача использования, но от другой руки я должен сделать имя пользователя определенные инициализации.
Проблема состоит в том, что получение имени пользователя и выполняет инициализацию, каждый раз является очень дорогим. Если я мог бы включить сессию, я мог бы просто сохранить инициализируемые данные в локальных переменных в сервисном экземпляре.
Существует ли способ включить и потоковую передачу и сессию в netTcpBinding?
Большие передачи файлов действительно проблема в WCF, а опция потоковой передачи не решает ничего (вам даже нужно больше памяти на сервере).
Если вы не хотите использовать розетки, могут решить проблему с реализацией вашего собственного «протокола» для разделения файла в блоках и передавать только отдельные блоки. Я использовал рецидивирование и транспортировку и транспортировку.
Интерфейс сервера (или клиента) выглядит что-то вроде этого:
[ServiceContract(CallbackContract = typeof(IClient), SessionMode = SessionMode.Required)]
public interface IServer
{
[OperationContract]
FilePart GetFileChunk(string identifier, int number, int blockSize);
}
как DataContract, вы можете использовать что-то вроде этого:
[DataContract]
public class FilePart
{
[DataMember] public int Part;
[DataMember] public byte[] Data;
[DataMember] public int BlockSize;
}
, чтобы найти размер «правильный» размер блока, который вы должны немного играть, я рекомендую что-то о 64-512 КБ. Когда они слишком маленькие, у вас есть запрос на лотере, когда они для большого, он становится медленно, и у вас больше нагрузки на стороне сервера.
Также важно, чтобы максимально оценивать, максимально использовать, максимум, а время тайм-аута достаточно высоки (в конфигурации связывания) и квотам считывания. Для тестирования я рекомендую использовать максимум для всех полей, когда он работает использовать значения, которые лучше подходят.
Если вы работаете с двусторонними привязками, вы можете пройти объекты с помощью Ref. С таким способом вы можете пройти объекты обратного вызова, поэтому вы лучше сможете просмотреть прогресс перевода и так далее ...
[OperationContract IsOneWay=true]
FilePart GetFileChunk(string identifier, int number, int blockSize, ref TransferState callback);
Я думаю, что это все хитрости и намеки, которые я могу дать. Я надеюсь, что это помогает.
Я не думаю, что WCF подходит для передачи больших файлов - попробуйте использовать System.Net.Sockets вместо этого, Clakeouge WCF основан на них.