Je vyžadována podpora jazyka JavaScript
Některé stránky na tomto webu vyžadují podporu jazyka JavaScript. Váš webový prohlížeč jazyk JavaScript nepodporuje nebo jazyk JavaScript není povolen.
Chcete-li zjistit, zda webový prohlížeč podporuje jazyk JavaScript nebo jazyk JavaScript chcete povolit, přečtěte si nápovědu k vašemu webovému prohlížeči.
ErrorHandler.cs
Download fileToto je zdrojový kód souboru ErrorHandler.cs
ErrorHandlingBehavior Attribute for Silverlight WCF services error handling.
using System; using System.Linq; using System.Collections.ObjectModel; using System.Reflection; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Description; using System.ServiceModel.Dispatcher; namespace IMP.Shared { internal sealed class ErrorHandler : IErrorHandler { #region member varible and default property initialization private ErrorHandlingBehaviorAttribute _attribute; private IExceptionToFaultConverter _converter; #endregion #region constructors and destructors public ErrorHandler(ErrorHandlingBehaviorAttribute attribute) { _attribute = attribute; if (_attribute.ExceptionToFaultConverter != null) _converter = (IExceptionToFaultConverter)Activator.CreateInstance(_attribute.ExceptionToFaultConverter); } #endregion #region IErrorHandler Members public bool HandleError(Exception error) { return true; } public void ProvideFault(Exception error, MessageVersion version, ref Message fault) { //If it's a FaultException already, then we have nothing to do if (error is FaultException) { return; } ServiceEndpoint endpoint = OperationContext.Current.Host.Description.Endpoints.Find( OperationContext.Current.EndpointDispatcher.EndpointAddress.Uri); DispatchOperation dispatchOperation = OperationContext.Current.EndpointDispatcher.DispatchRuntime.Operations.Where( op => op.Action == OperationContext.Current.IncomingMessageHeaders.Action).First(); OperationDescription operationDesc = endpoint.Contract.Operations.Find(dispatchOperation.Name); object faultDetail = GetFaultDetail(operationDesc.SyncMethod, operationDesc.Faults, error); if (faultDetail != null) { Type faultExceptionType = typeof(FaultException<>).MakeGenericType(faultDetail.GetType()); FaultException faultException = (FaultException)Activator.CreateInstance(faultExceptionType, faultDetail, error.Message); MessageFault faultMessage = faultException.CreateMessageFault(); fault = Message.CreateMessage(version, faultMessage, faultException.Action); } } #endregion #region private member functions private object GetFaultDetail(MethodInfo method, FaultDescriptionCollection faults, Exception error) { Type exceptionType = error.GetType(); object faultDetail = null; if (_converter != null) { faultDetail = _converter.ConvertExceptionToFaultDetail(error); if (faultDetail != null) { return faultDetail; } } if (method != null) { foreach (FaultDescription faultDesc in faults) { var constructor = faultDesc.DetailType.GetConstructor(BindingFlags.ExactBinding | BindingFlags.Public | BindingFlags.Instance, null, new Type[] { exceptionType }, null); if (constructor != null) { return constructor.Invoke(new object[] { error }); } } } foreach (FaultDescription faultDesc in faults) { if (faultDesc.DetailType == exceptionType) { return error; } } return null; } #endregion } [AttributeUsage(AttributeTargets.Class)] internal sealed class ErrorHandlingBehaviorAttribute : Attribute, IServiceBehavior { #region member varible and default property initialization private Type _exceptionToFaultConverterType; #endregion #region property getters/setters public Type ExceptionToFaultConverter { get { return _exceptionToFaultConverterType; } set { if (!typeof(IExceptionToFaultConverter).IsAssignableFrom(value)) throw new ArgumentException("Fault converter doesn't implement IExceptionToFaultConverter.", "value"); _exceptionToFaultConverterType = value; } } #endregion #region IServiceBehavior Members public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) { } public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { foreach (ChannelDispatcherBase chanDispBase in serviceHostBase.ChannelDispatchers) { ChannelDispatcher channelDispatcher = chanDispBase as ChannelDispatcher; if (channelDispatcher == null) continue; channelDispatcher.ErrorHandlers.Add(new ErrorHandler(this)); } } public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { } #endregion } internal interface IExceptionToFaultConverter { object ConvertExceptionToFaultDetail(Exception error); } }