Gönderilen ve alınan(talep edilen) veri boyutu öndeğerlerin üzerinde olabilir. Logo Object Service içerisinde bu değerler maximum alabileceği değerler ile set edilmiştir. Ancak alıcı tarafında, kendi projenizde de bu değerlerin belirtilmesi gerekmektedir. Aşağıdaki örnek .NET projesinde, servisin HTTP ucu kullanıldığında set edilmesi gereken app.Config değerleridir.
app.Config
<?xml version="1.0"encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding
name="BasicHttpBinding_ISvc"
maxBufferPoolSize="2147483647"
maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647"
receiveTimeout="00:30:00"
sendTimeout="00:01:00">
<securitymode="None"/>
<readerQuotas
maxStringContentLength="2147483647"
maxArrayLength="16384"
maxBytesPerRead="4096"
maxDepth="32"
maxNameTableCharCount="16384"
/>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpointaddress="http://localhost/LogoObjectService/Service"
binding="basicHttpBinding"bindingConfiguration="BasicHttpBinding_ISvc"
contract="ServiceReference2.ISvc"name="BasicHttpBinding_ISvc"/>
</client>
</system.serviceModel>
</configuration>
Sıkıştırma-açma kodu aşağıdaki gibidir. Bu kodu projenize eklemelisiniz. Metodların içerisindeki bazı fonksiyonların kullanılabilmesi için System.IO.Compression kütüphanesinin projeye eklenmesi gerekmektedir.
2.39 ve öncesinde kullanılan yöntem
internal static class StringCompressor
{
public static string CompressString(string text)
{
byte[] buffer = Encoding.UTF8.GetBytes(text);
var memoryStream = new MemoryStream();
using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress, true))
{
gZipStream.Write(buffer, 0, buffer.Length);
}
memoryStream.Position = 0;
var compressedData = new byte[memoryStream.Length];
memoryStream.Read(compressedData, 0, compressedData.Length);
var gZipBuffer = new byte[compressedData.Length + 4];
Buffer.BlockCopy(compressedData, 0, gZipBuffer, 4, compressedData.Length);
Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gZipBuffer, 0, 4);
return Convert.ToBase64String(gZipBuffer);
}
public static string DecompressString(string compressedText)
{
byte[] gZipBuffer = Convert.FromBase64String(compressedText);
using (var memoryStream = new MemoryStream())
{
int dataLength = BitConverter.ToInt32(gZipBuffer, 0);
memoryStream.Write(gZipBuffer, 4, gZipBuffer.Length - 4);
var buffer = new byte[dataLength];
memoryStream.Position = 0;
using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
{
gZipStream.Read(buffer, 0, buffer.Length);
}
return Encoding.UTF8.GetString(buffer);
}
}
}
2.40 ve sonrasında kullanılan yöntem
internal static class StringCompressor
{
private static void CopyTo(Stream src, Stream dest)
{
byte[] bytes = new byte[4096];
int cnt;
while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0)
{
dest.Write(bytes, 0, cnt);
}
}
public static byte[] Zip(string str)
{
var bytes = Encoding.UTF8.GetBytes(str);
using (var msi = new MemoryStream(bytes))
using (var mso = new MemoryStream())
{
using (var gs = new GZipStream(mso, CompressionMode.Compress))
{
CopyTo(msi, gs);
}
return mso.ToArray();
}
}
public static string Unzip(byte[] bytes)
{
using (var msi = new MemoryStream(bytes))
using (var mso = new MemoryStream())
{
using (var gs = new GZipStream(msi, CompressionMode.Decompress))
{
CopyTo(gs, mso);
}
return Encoding.UTF8.GetString(mso.ToArray());
}
}
// Base64
public static string ZipBase64(string compress)
{
var bytes = Zip(compress);
var encoded = Convert.ToBase64String(bytes, Base64FormattingOptions.None);
return encoded;
}
public static string UnzipBase64(string compressRequest)
{
var bytes = Convert.FromBase64String(compressRequest);
var unziped = Unzip(bytes);
return unziped;
}
}
Copyright © 2018 Logo Yazılım