Wat is die maklikste manier om kompressie by WCF in Silverlight te voeg?
-
08-06-2019 - |
Vra
Ek het 'n Silverlight 2 beta 2-toepassing wat toegang tot 'n WCF-webdiens verkry.As gevolg hiervan kan dit tans slegs basieseHttp-binding gebruik.Die webdiens sal redelik groot hoeveelhede XML-data terugstuur.Dit lyk taamlik verkwistend vanuit 'n bandwydte gebruik oogpunt aangesien die reaksie, indien gerits, kleiner sou wees met 'n faktor van 5 (ek het eintlik die antwoord in 'n txt-lêer geplak en dit gezip.).
Die versoek het wel die "Aanvaar-enkodering:gzip, deflate" - Is daar enige manier om die WCF-diens gzip (of andersins saamgepers) die reaksie te hê?
Ek het dit gevind skakel maar dit lyk sekerlik 'n bietjie kompleks vir funksionaliteit wat buite die boks IMHO hanteer moet word.
OK - ek het eers die oplossing gemerk deur die System.IO.Compression as die antwoord te gebruik aangesien ek nooit kon "lyk" om die IIS7 dinamiese kompressie te laat werk nie.Wel, soos dit blyk:
Dinamiese kompressie op IIS7 was werk al saam.Dit is net dat Nikhil se Web Developer Helper-inprop vir IE nie gewys het dat dit werk nie.My raaiskoot is dat aangesien SL die webdiensoproep aan die blaaier oorhandig, dat die blaaier dit "onder die dekmantels" hanteer en Nikhil se instrument sien nooit die saamgeperste reaksie nie.Ek kon dit bevestig deur Fiddler te gebruik wat verkeer buite die blaaiertoepassing monitor.In fiddler was die reaksie in werklikheid gzip saamgepers!!
Die ander probleem met die System.IO.Compression-oplossing is dat System.IO.Compression nie in die Silverlight CLR bestaan nie.
So vanuit my perspektief is die MAKLIKSTE manier om WCF-kompressie in Silverlight te aktiveer, om dinamiese kompressie in IIS7 te aktiveer en geen kode te skryf nie.
Oplossing
As jy IIS7 gebruik, kyk na die Kompressie module.Dit laat jou toe om kompressie vir HTTP-versoeke na jou bediener op te stel.
Ander wenke
WS-Compression for WCF laat jou toe om kompressie op die binding op te stel.
Sien WS-kompressie vir WCF deur Pablo M.Cibraro
Alternatiewelik, probeer Microsofts GZip Encoder Voorbeeld wat "'n enkodeerderkanaal skep wat die System.IO.Compression.GZipStream-klas gebruik om uitgaande WCF-boodskappe saam te pers"
Ek het nie 'n inheemse manier vir WCF gesien om kompressie te doen toe ek onlangs 'n WCF-projek gedoen het nie.Ek het net die System.IO.Compression naamruimte gebruik en 'n vinnige kompressor gemaak.Hier is die kode wat ek gebruik het
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;
}
}
dan het ek net my dienste laat inneem 'n grepe-skikking as 'n invoer, soos so
void ReceiveData(byte[] data);
Het goed uitgewerk vir my.
Daar moet ook kennis geneem word dat jy dalk die mimiektipe by moet voeg applicationHost.config
onder <httpCompression><dynamicTypes>
afdeling benewens om kompressie vir die webwerf moontlik te maak:
<add mimeType="application/soap+msbin1" enabled="true" />
As sekere dinamiese response nie saamgepers word nie (en sommige word), kan dit 'n mimiektipe-probleem wees.Gebruik Fiddler om die besonderhede te kry wat met die versoek geassosieer word.Mislukte versoekopsporing kan nuttig wees om te bepaal of IIS selfs probeer om die reaksie saam te druk of nie.As kompressie korrek opgestel is, sal jy 'n sien NO_MATCHING_CONTENT_TYPE
in die volledige spoor gedeelte van die spooruitset.