SORU
22 Mayıs 2009, Cuma


Özel XML Hizmetleri için Günlük ELMAH kullanarak

Mükemmel ELMAH ASP.NET 3.5 web uygulaması işlenmeyen özel durumlar ile başa çıkmak için kullanıyoruz. Bu tüketilen ediliyor sitenin tüm XML hizmetleri dışında son derece iyi geri KALAN özelliklerini kullanarak çalışır. Bir istisna işlem içinde uygulama kodu tarafından işlenen yöntemleri oluştuğunda, XML çeşitli şekillerde hizmet sözleşmeleri ve yapılandırma ayarlarına bağlı olarak işler. Bu durum ASP.NET bu HttpApplication ateş sonu anlamına gelir.Hata ELMAH kullandığı olay. Bu ile başa çıkmak için farkındayım iki çözüm:

  • Her yöntemi deneyin aramalar Wrap { } catch(özel Durum ex) { Elmah.ErrorSignal.() FromCurrentContext.Zam(ex); throw; } açıkça catch bloğu içinde Elmah aramak için.
  • Ayrı bir hakkında daha fazla bilgi için ELMAH çağrısı faktör anlamak için kullan Making WCF and ELMAH play nice together blog Will Hughes' açıklanan IErrorHandler.

İlk seçenek, son derece basittir ama tam olarak DRY değildir. İkinci seçenek, yalnızca özniteliği hakkında daha fazla bilgi ve uygulama sonrası özel öznitelik ile her hizmet süslemek için gerektirir. Will's işe göre ben bunu yaptım ama bu durumda olduğundan emin olmak istiyorumdoğru bir yaklaşımkodu göndermeden önce.

Ben kaçırdım daha iyi bir yolu var mı?

IErrorHandler web documenation olduğunu söylüyorHandleErroryöntem giriş yapmak için bir yerdir ama ELMAH HttpContext erişir.Mevcut.ApplicationİnstanceHttpContext olsa da bu yöntem içinde boş olan.,Geçerli kullanılabilir. ProvideFault yöntemi içinde Elmah çağrısı yapmadan Applicationİnstance ayarlanır ama bu niyet API belgelerinde açıklandığı eşleşmiyor gibi geçici bir çözüm.Bir şey mi kaçırıyorum?Belgelere bu kapsamda HandleError yöntemi Applicationİnstance boş neden olabilecek işlem parçacığı " denmesinden güvenmemelisiniz devlet yapar.

CEVAP
25 Mayıs 2009, PAZARTESİ


Benim blog yazısı (OP başvurulan) çözüm/HTTP Yanıt Kodları değiştirmek için kullanıyor bir hata durumu sırasında olduğumuzu varolan bir çözüm dayanıyordu.

Yani, bizim için ELMAH İstisnası geçirmek için tek satırlık bir değişiklik oldu. Eğer daha iyi bir çözüm varsa, ben de bunu bilmek isterim.

Gelecek nesiller Referans potansiyel/iyileştirme - burada mevcut çözümden kodu.

HttpErrorHandler ve ServiceErrorBehaviourAttribute Sınıflar

using System;
using System.ServiceModel;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.Collections.ObjectModel;
using System.Net;
using System.Web;
using Elmah;
namespace YourApplication
{
    /// <summary>
    /// Your handler to actually tell ELMAH about the problem.
    /// </summary>
    public class HttpErrorHandler : IErrorHandler
    {
        public bool HandleError(Exception error)
        {
            return false;
        }

        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            if (error != null ) // Notify ELMAH of the exception.
            {
                if (System.Web.HttpContext.Current == null)
                    return;
                Elmah.ErrorSignal.FromCurrentContext().Raise(error);
            }
        }
    }
    /// <summary>
    /// So we can decorate Services with the [ServiceErrorBehaviour(typeof(HttpErrorHandler))]
    /// ...and errors reported to ELMAH
    /// </summary>
    public class ServiceErrorBehaviourAttribute : Attribute, IServiceBehavior
    {
        Type errorHandlerType;

        public ServiceErrorBehaviourAttribute(Type errorHandlerType)
        {
            this.errorHandlerType = errorHandlerType;
        }

        public void Validate(ServiceDescription description, ServiceHostBase serviceHostBase)
        {
        }

        public void AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection parameters)
        {
        }

        public void ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase)
        {
            IErrorHandler errorHandler;
            errorHandler = (IErrorHandler)Activator.CreateInstance(errorHandlerType);
            foreach (ChannelDispatcherBase channelDispatcherBase in serviceHostBase.ChannelDispatchers)
            {
                ChannelDispatcher channelDispatcher = channelDispatcherBase as ChannelDispatcher;
                channelDispatcher.ErrorHandlers.Add(errorHandler);
            }
        }
    }
}

Kullanım Örneği

ServiceErrorBehaviour Özniteliği XML Hizmetleri süsleyin:

[ServiceContract(Namespace = "http://example.com/api/v1.0/")]
[ServiceErrorBehaviour(typeof(HttpErrorHandler))]
public class MyServiceService
{
  // ...
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Māris Zaharovs

    Māris Zahar

    28 Mayıs 2008
  • spederson7

    spederson7

    17 Temmuz 2006
  • Tutorials Junction

    Tutorials Ju

    1 Ocak 2014