.Net general


När du skapar en metod i VB.Net blir parametrar ByVal om du inte anger någonting annat. Detta innebär att du vill få en lokal kopia av ditt objekt in till din metod. Det man ofta inte tänker på är att man inte får en kopia av eventuella underliggande objekt. Om inte dina objekt har en impelentation som automatisk hanterar det som kallas ’Deep cloning’.

Det som händer vid ett metodanrop med en ByVal-parameter är att en ’Shallow cloning’ görs. Detta innebär att ditt objekt kopieras, men eventuella underliggande objekt som det objektet pekar på kopieras inte, och alltså pekar på samma objekt. Vi kan exemplifiera detta med en Collection av typen Arraylist där varje element i listan innehåller ett objekt av typen MinKlass.

Klassen MinKlass består av två properties, ID och Namn. I Arraylist minLista har vi lagt två element, ett med namnet ”Stig” och ett med namnet ”Helmer”. ID skapas av klassen själv vid initiering.

Sedan skickas minLista in till en metod (sub)

private sub Check(ByVal ArrayList lista)

I metoden Check görs följande:

 

For Each min As MinKlass In lista
     min.Namn = ”Arne”
Next

Vad som man vill skall hända här är att den lokala listan lista’s objekt av typen MinKlass skall ändras. Det som händer är att när du anropar metoden ‘Check’ görs en ‘shallow clone’ på objektet minLista till lista, vilket innebär att endast själva objektet minLista kopieras till lista. De underliggade objekten MinKlass1 och MinKlass2 kopieras inte, utan lista pekar fortfarande på MinKlass1 och MinKlass2:

 

Har man jobbat med exempelvis C++ tidigare och man vet att de flesta objekt i .Net är referenstyper kan detta te sig självklart. Där är man van vid att hantera pekare och ‘adresserade’ objekt.

Orsaken till detta är att det som lagras i minLista endast är en pekare till objekten MinKlass1 och MinKlass2.

Även om man i funktionen Check gör en (tror man) lokal kopia på varje objekt (MinKlass1 och MinKlass2), är det också då själva adressen som pekar på objekten man gör en kopia på. För att man skall kunna göra en ‘Deep Clone’ måste man implementera stöd för det i sin klass, eller kopiera objekten property för property.

Så för att man skall kunna använda lokala kopier på MinKlass-objekten måste man alltså själv se till att det finns lokala kopier på objekten. Har du serialiserbara objekt kan du använda serialisering för att skapa en kopia och då ha en generell funktion som kan hantera kopiering av olika typer av objekt. Annars kan man applicera interfacet ICloneable på sin klass eller skapa copy-constructors.

Olika sätt att göra på finns exempelvis beskrivet på http://www.windojitsu.com/blog/copyctorvsicloneable.html.

Man kan även se att Brad Adams diskuterar om man skall använda ICloneable överhuvudtaget.

Jag har tidigare skrivit om det här felet som uppstår om man skall kommunicera med en server via SSL och det certifikat som servern använder på något sätt inte är gilltigt. Antigen litar maninte på utfärdaren, det kan vara spärrad, ingen spärrlistainformation finns med, något är fel med datumen eller någonting annat.

I mitt förra inlägg skrev jag exempel på hur man i kod kan undvika kontroll av sådana SSL-certifikat. Nu är det ju inte alltid man vill eller kan ändra koden, så hur gör man om man annars då? Jo, först och främst kan man se om man inte kan installera root-certifikatet till den som har utfärdat SSL-certifikatet. Det bör man kunna göra även om man har ett internt certifikat. Har man använt SelfSSL eller liknande kan det uppstå problem, men skapar man det på den dator som skall ta emot responsen borde även det fungera eftersom det då blir den datorn (klienten) som har utfärdat certifikatet (detta har jag dock inte provat!).

Men sen kan man ha flera problem, exempelvis att certifikatet inte innehåller någon revocation-information eller att namnet inte stämmer med de anrop du gör. Detta löser man genom att i machine.config ändra värden i servicePointManager. Om man inte vill göra något namn- eller revokeringskontroll ställer man in den enligt följande:

<servicePointManager checkCertificateName="false" checkCertificateRevocationList="false" />

Enda nackdelen är väl att man sätter delar av säkerheten ur spel, så gör det här endast i utvecklings- och testmiljöer!

Du kan hitta mera info om detta på MSDN

Jag har hos en kund haft önskemål om att kunna lägga loggar som skall skrivas till eventloggen till en egen 'logfile'. Detta för att kunna separera ut fel från den egna applikationsfloran.

En logfile beskriver information som log-tjänsten i Windows behöver för att kunna skapa logentries i eventloggen. Som standard finns Application, Security och System. Dessa finns definierade i registret under HKEY_LOCAL_MACHINE\SYSTEM\Services\Eventlog. Här kan man också skapa egna (Custom) logfiles. Det kan antigen göras manuellt i registret eller programmatisk.

mer information om hur du går tillväga finns på http://www.codeproject.com/dotnet/evtvwr.asp

Här finns även information om hur du skapar egna Message DLL's och annat gott om hantering av eventloggen.

I en artikel på Codeproject beskrivs hur man skall överlagra Paint-eventet i en Windows Form för att skapa ett eget utseende på sina formulär. Nu finns det en uppsjö produkter som anpassar alla fönster i Windows enligt en mall, men av och till kan det vara roligt att skapa sitt eget utseende på ett fönster.

Om du använder ett certifikat som på något sätt är felaktigt eller kommer från en utfärdare som du inte litar på, får du upp en dialog som frågar om du vill lita på certifikatet. Alltså om du surfar med en webbläsare. Om du använder en egenutvecklad klient så får du troligen ett exception i koden:

An unhandled exception of type 'System.Net.WebException' occurred in system.dll

Additional information: The underlying connection was closed: Could not establish trust relationship with remote server.

För att komma runt det här måste du i koden skapa din egen klass som skall implementera ICertificatePolicy. I ICertificatePolicy finns en funktion som du måste överlagra, CheckValidationResult.

Den returnerar true eller false, beroende på om du i din kod vill lite på certifikatet. Här kan man u då välja om man vill göra någon kontroll av certifikatet eller bara släppa det rakt genom.

public class CertificatePolicy : System.Net.ICertificatePolicy
{
  public bool CheckValidationResult(ServicePoint sp, X509Certificate cert, WebRequest req, int problem)
  {
    return true;
  }
}

För att din applikation skall använda klassen är det bara att ange detta i koden genom att skapa en instansav den och tilldela instansen till CertificatePolicy:

System.Net.ServicePointManager.CertificatePolicy = new CertificatePolicy();

Vill man göra en kontroll av certifikatet görs det i funktionen CheckValidationResult. Då kan man exempelvis titta på utfärdare:

string strIssuer = cert.GetIssuerName(); 

Eller men kan titta på från vilken IP anropet kom:

string strIP = req.RequestUri.Host 

Jon Galloway  har listat sina tio favoritbloggar. Eller egentligen är det de bloggar som har mest träffar och som håller sig till de ämnen de utger sig för att handla, alltså .Net. De skall också a RSS-feeds.

Det finns en förvånande mängd design exempel för webbapplikationer att tillgå ute på nätet. Blandet med lite länkar som har information om CSS'er finns även en del länkar där man kan hitta många snygga templates som man kan ladda ner om man skall skapa en webbsite.

Nästa sida »