Существует ли способ включить и сессию и передающий потоком в netTcpBinding?

Я пишущий Сервису WCF, который должен передать большие файлы, таким образом, я потоковая передача использования, но от другой руки я должен сделать имя пользователя определенные инициализации.

Проблема состоит в том, что получение имени пользователя и выполняет инициализацию, каждый раз является очень дорогим. Если я мог бы включить сессию, я мог бы просто сохранить инициализируемые данные в локальных переменных в сервисном экземпляре.

Существует ли способ включить и потоковую передачу и сессию в netTcpBinding?

5
задан DxCK 15 January 2010 в 23:32
поделиться

2 ответа

Большие передачи файлов действительно проблема в 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);   

Я думаю, что это все хитрости и намеки, которые я могу дать. Я надеюсь, что это помогает.

4
ответ дан 14 December 2019 в 19:13
поделиться

Я не думаю, что WCF подходит для передачи больших файлов - попробуйте использовать System.Net.Sockets вместо этого, Clakeouge WCF основан на них.

1
ответ дан 14 December 2019 в 19:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: