Donnerstag, 11. Dezember 2008

Error: 0x80040204 - Invalid user auth.

Die im Titel stehende Meldung erhielt ich letztens beim lauf einer meiner Schnittstellen, die sich sequentiell durch Datensätze (in meinem Fall Accounts) eines CRM Systems per Webservice itteriert und darin automatisiert Änderungen durchführt.

Kleiner Fehler ganz groß. Als erstes wurde von allen (ausser mir ;) ) vermutet das sich der am CRM anmeldende User etwas erlaubt was ihm so nicht gestattet ist. Da ich diesen User aber bei allen Zugriffen benutze und alle anderen ja einwandfrei funktionierten, konnte ich das gleich ausschließen.
Meine Vermutung ging in Richtung des im Datensatz selbst zugewiesenen Systemuser (Owner) der bei jeder Änderung mit überegben wird. Dieser User ist ein auf der CRM Seite vorhandener Domänenuser und wird vom CRM System noch einmal extra als Entität "Systemuser" gehalten.
Meine Recherchen ergaben das man den Domänenuser aus der Domäne GELÖSCHT hatte, aber der User natürlich immer noch im CRM als Entität "Systemuser" vorhanden und bei vielen Datensätzen als Owner eingetragen war.
Durch die Löschung jedoch aus der Domäne hat der User praktisch alle rechte verloren und darf somit seine ihm zugeteilten Datensätze auch nicht mehr ändern.
Im vorliegenden Fall, hat die Firma in deren CRM das vorgekommen ist, in allen Datensätze mit einer Referenz zu dem rechtelosen User diesen durch einen in der Domäne noch aktiven User ausgetauscht. Damit hat dann wieder alles funktioniert.
CU TerA 

Freitag, 5. Dezember 2008

throw ex vs throw

Es ist eigentlich ein alter Hut, der Unterschied zwischen throw ex und throw sollte jedem bekannt sein. Throw ex schneidet den alten Stack Trace ab und verpackt sozusagen den Fehler neu, Throw hingegen nicht.

Aber dennoch halten sich irgendwie hartnäckig gegenteilige Meinungen, vermutlich aus den Gegenbenheiten aus Java resultierend, aber ich habe auch schon einige ellenlange Threads gelesen in denen das vollkommen Falsche dargelegt wurde, bis hin zu Projektleitern die von einem Verlangen ein ganzes Projekt umzuprogrammieren, weil sie der Meinung wären es wäre genau anders herum. 

Den Beweis zu führen ist recht simpel, entweder man schaut sich den MSIL Code an und erkennt das throw zu einem rethrow compiliert, während throw ex, ein throw ex bleibt. Oder aber man testet es einfach mit einem Programm folgender Art selber aus, um auch den letzten Kritiker hoffentlich verstummen zu lassen...

   1:  class ThrowVsThrowEx
   2:  {
   3:     static void Main(string[] args)
   4:     {
   5:        try
   6:        {
   7:           ReThrow();
   8:        }
   9:        catch(Exception ex)
  10:        {
  11:           Console.WriteLine("ReThrow sent: " + ex.ToString());
  12:        }
  13:   
  14:        Console.Write(System.Environment.NewLine);
  15:   
  16:        try
  17:        {
  18:           ThrowNew();
  19:        }
  20:        catch (Exception ex)
  21:        {
  22:           Console.WriteLine("ThrowNew sent: " + ex.ToString());
  23:        }
  24:   
  25:        Console.ReadLine();
  26:     }
  27:   
  28:     static void ReThrow()
  29:     {
  30:        try
  31:        {
  32:           DontCallMe();
  33:        }
  34:        catch
  35:        {
  36:           throw;
  37:        }
  38:     }
  39:   
  40:     static void ThrowNew()
  41:     {
  42:        try
  43:        {
  44:           DontCallMe();
  45:        }
  46:        catch(Exception ex)
  47:        {
  48:           throw ex;
  49:        }
  50:     }
  51:   
  52:     static void DontCallMe()
  53:     {
  54:        throw new ApplicationException("I said don't call me!!");
  55:     }
  56:  }


Ergebnis von throw:

ReThrow sent: System.ApplicationException: I said don't call me!! at DemoExceptions.ThrowVsThrowEx.DontCallMe() in C:\Projects\DemoExceptions\D emoExceptions\ThrowVsThrowEx.cs:line 54 at DemoExceptions.ThrowVsThrowEx.ReThrow() in C:\Projects\DemoExceptions\Demo Exceptions\ThrowVsThrowEx.cs:line 36 at DemoExceptions.ThrowVsThrowEx.Main(String[] args) in C:\Projects\DemoExcep tions\DemoExceptions\ThrowVsThrowEx.cs:line 7


und das Ergebnis von throw ex:

ThrowNew sent: System.ApplicationException: I said don't call me!! at DemoExceptions.ThrowVsThrowEx.ThrowNew() in C:\Projects\DemoExceptions\Dem oExceptions\ThrowVsThrowEx.cs:line 48 at DemoExceptions.ThrowVsThrowEx.Main(String[] args) in C:\Projects\DemoExcep tions\DemoExceptions\ThrowVsThrowEx.cs:line 18


Wunderbar zu erkennen wie throw ex den Ursprung abgeschnitten hat und stattdessen bei sich "selbst" anfängt... keine Worte :)