Отмена вызовов WCF с большими данными?

Я собираюсь реализовать FileService с использованием WCF. Он должен иметь возможность загружать файлы, указав сам файл и содержимое файла. Текущий ServiceContract выглядит следующим образом

[ServiceContract]
public interface IFileService
{
    [OperationContract]
    [FaultContract(typeof(FaultException))]
    byte[] LoadFile(string relativeFileNamePath);

    [OperationContract]
    [FaultContract(typeof(FaultException))]
    void SaveFile(byte[] content, string relativeFileNamePath);
}

На данный момент он работает нормально, но я хочу иметь возможность уменьшить нагрузку на сеть моего приложения, используя этот Fileservice. Мне нужно предоставить много файлов, как только пользователь откроет определенный раздел моего приложения, но я мог бы отменить некоторые из них, как только пользователь перейдет дальше через приложение. Поскольку многие из моих файлов находятся где-то между 50 и 300 МБ, передача файлов занимает довольно много секунд (приложение может работать в очень медленных сетях, это может занять минуту).

Чтобы прояснить и очертить разницу между всеми этими другими вопросами WCF: Конкретная проблема заключается в том, что предоставление данных между клиентским <-> сервером является узким местом, а не производительностью самой службы. Разумно ли менять интерфейс на потоковый сервис WCF?

1 ответ

Рекомендуется использовать поток, если размер файла превышает определенную величину. В моей работе над корпоративным приложением мы пишем, что если оно больше 16 КБ, мы его транслируем. Если оно меньше, мы буферизируем. Наш файловый сервис специально разработан для обработки этой логики.

Когда у вас установлен режим передачи вашего сервиса в буфер, он будет буферизироваться как на клиенте, так и на сервисе при передаче ваших данных. Это означает, что если вы отправляете файл 300 МБ, он будет буферизовать все 300 МБ во время вызова на обоих концах, прежде чем вызов будет завершен. Это определенно создаст узкие места. По соображениям производительности это следует делать только тогда, когда у вас есть небольшие файлы, которые быстро буферизуются. В противном случае поток - это лучший путь.

Если большинство или все ваши файлы являются большими, я бы переключился на использование потока.

Другие вопросы по тегам