
Una eccezione sollevata da un servizio web WCF pubblicato su IIS se cercate di scaricare via SOAP un oggetto (ad esempio una immagine) che in Base64 è più lunga di 216-1 byte.
Per ovviare al problema dovete intervenire sull’applicazione client non sul server dove gira il servizio web, nel mio caso si tratta di una applicazione Winforms (per il test) i parametri devono essere inseriti nell’app.config, se fosse una applicazione web dovrei modificare il web.config.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ISoapWS" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65535" maxBufferPoolSize="500000" maxReceivedMessageSize="65535"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="64" maxStringContentLength="65535" maxArrayLength="65535"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost/MyWebservice/ServiceClass.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISoapWS"
contract="SoapWsTest.ISoapWS" name="BasicHttpBinding_ISoapWS" />
</client>
</system.serviceModel>
</configuration>
Dovete modificare i seguenti parametri
- maxBufferSize="65535"
- maxBufferPoolSize="500000"
- maxReceivedMessageSize="65535"
- maxStringContentLength="65535"
- maxArrayLength="65535"
Ad un valore che ritenete sufficiente per le vostre esigenze. Attenzione che se non li modificate tutti, riceverete una ulteriore eccezione per ognuno dei parametri che non sono abbastanza grandi. E’ ovvio che i parametri sono arbitrari, se dovete scaricare immagini o documenti PDF o files molto grandi andate sui milioni senza paura e ricordate che Bas64 è uno dei più dispendiosi fra i formati di trasmissione dati.
Ieri ho bloggato una nota per alcune conversioni poco frequenti che ho dovuto fare a causa di una routine di checksum che ho scritto per Alberto. Oggi ho scoperto che la mia ottimistica versione era largamente superata dal meccanismo reale del calcolo del checksum, per riuscire a riprodurre il quale ho dovuto effettuare una serie di stranezze che vi listo di seguito nel caso abbiate la “fortuna” (poca) di scontrarvi con qualcosa di simile.
Leggere un sub-array da un byte array
byte[] sourceArray;
... //Qui mettete i bytes nell’array leggendo un file o una seriale
byte[] destArray = new byte[desiredSublength]
Array.Copy(sourceArray, StartIndex, destArray, DestStartIndex, Length);
Conversione dei bytes nei corrispondenti caratteri ascii
char[] chars = System.Text.Encoding.UTF8.GetChars(destArray);
Far diventare una porzione dell’array di caratteri una string
string subValue = new string(charsArray, startIndex, length);
Convertire la stringa rappresentante un numero esadecimale in un byte
byte myHexByte = Convert.ToByte("1C", 16);
Convertire un byte in una stringa rappresentante il numero in esadecimale
string hexString = Convert.ToString(myByteValue, 16);
Fate attenzione che la stringa sia correttamente upper o lower case
string lowerHex = hexString.ToLower();
string upperHex = hexString.ToUpper();
Questo perché db e DB sono lo stesso numero ma cambiano completamente se convertite la stringa in un char array
char[] hexLetters = upperHex.ToCharArray();
e poi convertite il char array in un byte array
byte[] bytesFromHexLetters = new byte[hexLetters.Length];
for (int i = 0; i < hexLetters.Length; i++)
{
bytesFromHexLetters [i] = Convert.ToByte(chars[i]);
}
Provate con le lettere esadecimali in upper e lower case e ve ne accorgete, e se mi chiedete, ma tutto in una routine di calcolo del checksum?
qui lo chiamiamo Ufficio Complicazione Affari Semplici, sembra essere spesso molto affollato.