Jaki jest najprostszy sposób na dodanie kompresji do WCF w Silverlight?
Mam aplikację silverlight 2 beta 2, która ma dostęp do serwisu WWW WCF. Z tego powodu obecnie może używać tylko wiązania basicHttp. Webservice zwróci dość duże ilości danych XML. Wydaje się to dość marnotrawne z punktu widzenia wykorzystania przepustowości, ponieważ odpowiedź, jeśli jest spakowana, byłaby mniejsza o współczynnik 5 (w rzeczywistości wkleiłem odpowiedź do pliku txt i spakowałem ją.).
Żądanie ma "Accept-Encoding: gzip, deflate" - czy jest jakiś sposób aby WCF service gzip (lub inaczej kompresować) odpowiedź?
Znalazłem ten link ale na pewno wydaje się to trochę skomplikowane dla funkcjonalności, które powinny być obsługiwane out-of-the-box IMHO.
OK-na początku zaznaczyłem rozwiązanie za pomocą System.IO.Compression jako odpowiedź, ponieważ nigdy nie mogłem "wydawać się", aby kompresja dynamiczna IIS7 działała. Jak się okazuje:
Dynamiczna kompresja na IIS7 była Działa al. Po prostu Nikhil ' s Web Wtyczka pomocnicza programisty dla IE nie pokazała, że działa. Domyślam się, że skoro SL przekazuje usługę sieciową do przeglądarki, to przeglądarka obsługuje ją "pod przykrywką", a narzędzie Nikhila nigdy nie widzi skompresowanej odpowiedzi. Udało mi się to potwierdzić za pomocą programu Fiddler, który monitoruje ruch na zewnątrz przeglądarki. W fiddler odpowiedź była, w rzeczywistości, GZIP skompresowany!!
Innym problemem z rozwiązaniem kompresji System. IO jest to, że System.IO. Compression nie istnieje w Silverlight CLR.
Więc z mojego punktu widzenia najprostszym sposobem na włączenie kompresji WCF w Silverlight jest włączenie dynamicznej kompresji w IIS7 i napisanie żadnego kodu.
4 answers
Jeśli używasz IIS7, spójrz na moduł kompresji . Pozwala to skonfigurować kompresję żądań HTTP do serwera.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-13 18:22:03
WS-Compression for WCF pozwala skonfigurować kompresję na wiązaniu.
Zobacz WS-kompresja dla WCF By Pablo M. Cibraro
Alternatywnie wypróbuj próbkę kodera Microsofts gzip Encoder Sample , który "tworzy kanał kodera, który używa klasy System.IO.Compression.GZipStream do kompresji wychodzących wiadomości WCF"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-30 15:43:37
Nie widziałem natywnego sposobu na kompresję WCF podczas wykonywania projektu WCF. Po prostu użyłem przestrzeni nazw System.IO.Compression i zrobiłem szybki kompresor. Oto kod, którego użyłem
public static class CompressedSerializer
{
/// <summary>
/// Decompresses the specified compressed data.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="compressedData">The compressed data.</param>
/// <returns></returns>
public static T Decompress<T>(byte[] compressedData) where T : class
{
T result = null;
using (MemoryStream memory = new MemoryStream())
{
memory.Write(compressedData, 0, compressedData.Length);
memory.Position = 0L;
using (GZipStream zip= new GZipStream(memory, CompressionMode.Decompress, true))
{
zip.Flush();
var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
result = formatter.Deserialize(zip) as T;
}
}
return result;
}
/// <summary>
/// Compresses the specified data.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="data">The data.</param>
/// <returns></returns>
public static byte[] Compress<T>(T data)
{
byte[] result = null;
using (MemoryStream memory = new MemoryStream())
{
using (GZipStream zip= new GZipStream(memory, CompressionMode.Compress, true))
{
var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
formatter.Serialize(zip, data);
}
result = memory.ToArray();
}
return result;
}
}
Wtedy moje usługi pobierały tablicę bajtów jako dane wejściowe, takie jak
void ReceiveData(byte[] data);
Dobrze mi poszło.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-13 16:28:06
Należy również zauważyć, że może być konieczne dodanie typu mime do applicationHost.config
w sekcji <httpCompression><dynamicTypes>
oprócz włączenia kompresji dla strony:
<add mimeType="application/soap+msbin1" enabled="true" />
Jeśli niektóre dynamiczne odpowiedzi nie są kompresowane (a niektóre są), może to być problem typu mime. Użyj Fiddler, aby uzyskać szczegóły związane z żądaniem. Nieudane śledzenie żądań może być przydatne do określenia, czy usługa IIS próbuje nawet skompresować odpowiedź. Jeśli kompresja jest poprawnie skonfigurowana, będziesz Zobacz NO_MATCHING_CONTENT_TYPE
w sekcji complete trace wyjścia śledzenia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-28 13:55:16