1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

WebService Projekt

  • maciek
  • 25. September 2010 um 05:21
  • Unerledigt
  • maciek
    16
    maciek
    Mitglied
    Punkte
    2.805
    Beiträge
    434
    • 25. September 2010 um 05:21
    • #1

    Ich versuche gerade herauszugruebeln, wie ich am Besten zentrales Errorhandling in einem C# WebService Projekt implementiere. Anders als bei "normalen" WebSite/ASP Projekten, kann man dafuer ja nicht die "Application_Error" Methode in Global.asax verwenden.

    Ich habe paar Artikel gefunden, die in etwa erklaeren, wie das funktionieren soll (SoapExtension etc.), allerdings kann ich kein irgendwie deppensicheres Tutorial finden, wie man das ins Projekt selber integriert.

    Abgesehen davon, bin ich mir gar nicht 100% sicher, ob das ein g'scheite Loesung ist.

    Hat jemand vielleicht Erfahrung mit einer aehnlichen Fragestellung bzw. hat vielleicht paar step-by-step Tutorials bei der Hand?

    Danke.

    *** Make it idiot proof, and someone will build a better idiot. ***

  • damike
    8
    damike
    Mitglied
    Reaktionen
    11
    Punkte
    681
    Beiträge
    111
    • 25. September 2010 um 10:07
    • #2

    Hi

    Ich hab noch nicht direkt ein Webservice geschrieben (habs aber in einem ähnlichen Context gebraucht). Ich würde da IoC verwenden und mir das benötigte in die WCF Instanzen injizieren lassen:
    http://initializecomponent.blogspot.com/2008/06/unity-wcf-and-iis.html
    http://www.neovolve.com/post/2010/05/1…093-Part-1.aspx
    http://www.global-webnet.net/blogengine/pos…-and-unity.aspx

    Wenn du Exceptions innerhalb eines Calls handeln willst dann einfach in Unity ICallHandler implementieren. Dann geht:

    Code
    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
    {
        IMethodReturn result = null;            
    
    
        result = getNext()(input, getNext);
    
    
        if (result.Exception != null)
        {           
            // DoSomething with Exception ...
        }            
    
    
        return result;
    }
    Alles anzeigen

    Ich hoffe ich habe dein Problem richtig verstanden :winking_face:

    LG

  • maciek
    16
    maciek
    Mitglied
    Punkte
    2.805
    Beiträge
    434
    • 25. September 2010 um 15:48
    • #3

    Danke fuer die Idee und die Links.

    Allerdings bin ich nicht dabei eine neue App zu schreiben, sondern uebernehme eine bestehende. In dem Sinne bin ich etwas limitiert was groebere Architekturideen betrifft.

    Die bestehende App 0 Logging. Nicht mal error logging (geschweige denn andere sinnvolle Benchmarks). Deswegen bin ich auf der Suche nach einer zentralen Methode um zumindest error logging hinzuzufuegen (jede einzelne Webmethode durchzugehen und error logging hinzuzufuegen wird ziemlich muehsam).

    Nachdem das wie gesagt ziemlich einfach bei "normalen ASP Apps" funkt (Application_Error methode in Global.asax), hab ich mir gedacht, dass es auch einen einfachen Weg geben muss, dass fuer ein Webservice Projekt zu machne.

    Oder?

    *** Make it idiot proof, and someone will build a better idiot. ***

  • damike
    8
    damike
    Mitglied
    Reaktionen
    11
    Punkte
    681
    Beiträge
    111
    • 26. September 2010 um 08:46
    • #4

    Ah ok. Hast du dir schon http://msdn.microsoft.com/en-us/library/…ationstate.aspx angeschaut?

    Zitat

    A single instance of an HttpApplicationState class is created the first time a client requests any URL resource from within a particular ASP.NET application virtual directory. A separate single instance is created for each ASP.NET application on a Web server. A reference to each instance is then exposed via the intrinsic Application object.

    Beispiel http://msdn.microsoft.com/en-us/library/y8hhek39(VS.80).aspx

    Zitat

    Application state is a data repository that is available to all classes within an ASP.NET application. Application state is stored in memory on the server and is faster than storing and retrieving data in a database. Unlike session state, which is specific to a single user session, application state applies to all users and sessions. Therefore, application state is a useful place to store small amounts of often-used data that does not change from one user to another.

    So würdest du zumindest mal die Log Referenz hineinbekommen. Sonst kannst du noch PostSharp probieren - dann brauchst du nur annotieren - das sollte dann alle Exceptions abfangen.
    http://davybrion.com/blog/2008/05/w…with-postsharp/
    Oder mit WCF alleine
    http://www.haveyougotwoods.com/archive/2009/0…ler-in-wcf.aspx

    2 Mal editiert, zuletzt von damike (26. September 2010 um 08:49)

  • maciek
    16
    maciek
    Mitglied
    Punkte
    2.805
    Beiträge
    434
    • 27. September 2010 um 19:18
    • #5

    Danke fuer die Tipps.

    Ich hab das Problem nun folgendermassen geloest:

    SoapExtension an sich:

    C#
    using System;
    using System.IO;
    using System.Reflection;
    using System.Text;
    using System.Web.Services;
    using System.Web.Services.Protocols;
    
    
    using log4net;
    
    
    namespace SoapExtensions
    {
    
    
        public class ExceptionTraceExtension : SoapExtension
        {
    
    
            /// <summary>
            /// Logger
            /// </summary>
            private static ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
    
    
    
    
            #region Overriden methods (not used)
    
    
            public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
            {
                return null;
            }
    
    
            public override object GetInitializer(Type serviceType)
            {
                return null;
            }
    
    
            public override void Initialize(object initializer)
            {
            }
    
    
            #endregion
    
    
            public override void ProcessMessage(SoapMessage message)
            {
                switch (message.Stage)
                {
    
    
                    case SoapMessageStage.BeforeDeserialize:
                        break;
    
    
                    case SoapMessageStage.AfterDeserialize:
                        break;
    
    
                    case SoapMessageStage.BeforeSerialize:
                        // check for exception
                        Exception ex = message.Exception;
                        if (ex != null)
                        {
                            // get the base exception
                            ex = ex.GetBaseException();
    
    
                            // log the exception
                            _log.Error(ex.Message, ex);
                        }
                        break;
    
    
                    case SoapMessageStage.AfterSerialize:
                        break;
    
    
                    
                    default:
                        throw new ArgumentException("Invalid message stage.");
                }
            }
        }
    }
    Alles anzeigen

    Und dann die Web.config Modifikation:

    Code
    **snip**
        <webServices>
          <soapExtensionTypes>
            <add type="SoapExtensions.ExceptionTraceExtension,[AssemblyNameWhereSoapExtensionEmbedded]"
                 priority="1"
                 group="High" />
          </soapExtensionTypes>
        </webServices>
    **snip**

    Hier sind einige Links die hilfreich dabei waren:
    http://msdn.microsoft.com/en-us/magazine/cc164007.aspx
    http://forums.asp.net/p/1348319/2746321.aspx
    http://stackoverflow.com/questions/2628…ning-on-iis-6-0

    Das ist auch ein interessanter Artikel, funkt aber wie gesagt nicht fuer Web Services:
    http://msdn.microsoft.com/en-us/library/aa479332.aspx

    *** Make it idiot proof, and someone will build a better idiot. ***

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung