Кодировщик сообщений, описанный здесь , должен выполнить эту работу.
Я проверил, используя образец, загруженный по ссылке, доступной в статье выше (проект InstallDrive \ WF_WCF_Samples \ WCF \ Extensibility \ MessageEncoder \ Compression из this ) и Fiddler.
Обратите внимание, что в образце MSDN есть ошибка, которую вам нужно будет исправить, чтобы она правильно работала.В классе GZipMessageEncoderFactory
, метод CompressBuffer
, следующую строку
ArraySegment<byte> byteArray = new ArraySegment<byte>(bufferedBytes, messageOffset, bufferedBytes.Length - messageOffset);
следует заменить на
ArraySegment<byte> byteArray = new ArraySegment<byte>(bufferedBytes, messageOffset, totalLength);
. После применения вышеуказанного исправления все тело сообщения будет сжато.
Чтобы проверить правильность сжатия, вы можете использовать опцию AutoDecode из Fiddler.Однако AutoDecode распаковывает сообщение только в том случае, если оно имеет заголовок HTTP Content-Encoding: gzip
.
Добавление заголовков HTTP к вызовам сообщений WCF не является прямой задачей, поскольку WCF был спроектирован так, чтобы быть независимым от транспорта, и приложения WCF не должны обрабатывать элементы, специфичные для определенного метода транспорта.
Однако для целей этого приложения я смог сделать это, используя следующий фрагмент кода:
public string Echo(string input)
{
using (OperationContextScope opScope = new OperationContextScope((IContextChannel)base.Channel))
{
HttpRequestMessageProperty reqProps = new HttpRequestMessageProperty();
reqProps.Headers["Content-Encoding"] = "gzip";
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = reqProps;
return base.Channel.Echo(input);
}
}
Echo - это один из методов клиента из образца MSDN и внутри него.Я получаю доступ к текущему контексту операции, чтобы добавить HTTP-заголовок.
Пожалуйста, дайте мне знать, если вам нужна дополнительная помощь.