2016-03-29 3 views
1

У меня есть индивидуальный аспект, который я пытаюсь добавить в свою службу, чтобы автоматически регистрировать всю ошибку и отправлять соответствующее сообщение об ошибке, но когда я пытаюсь применить ее к классу и установить Attributetargetelements к Multicast.method или применить его к отдельному методу, моя служба возвращает ошибку 500 с сообщением об ошибкеPostsharp Методсторонний аспект не работает с WCF Класс сервиса

HTTP/1.1 500 Internal Server Error 
Content-Length: 5829 
Content-Type: application/json; charset=utf-8 
Server: Microsoft-HTTPAPI/2.0 
jsonerror: true 
WWW-Authenticate: oRswGaADCgEAoxIEEAEAAACpU1QBCKB37wAAAAA= 
Date: Tue, 29 Mar 2016 10:03:03 GMT 

{ "ExceptionDetail": { "HelpLink": нулевой, "InnerException": { "HelpLink ": null," InnerException ": {" HelpLink ": null," InnerException ": {" HelpLink ": null," InnerException ": null," Message ":" Объект не может быть сохранен в массиве этого типа. ", «StackTrace»: «в System.Array.InternalSetVal ue (значение Void *, значение объекта) \ u000d \ u000a в System.Array.SetValue (значение объекта, индексы Int32 []) \ u000d \ u000a в System.Runtime.Serialization.ObjectManager.CompleteObject (держатель ObjectHolder, Boolean bObjectFullyComplete) \ u000d \ u000a в System.Runtime.Serialization.ObjectManager.DoNewlyRegisteredObjectFixups (держатель ObjectHolder) \ u000d \ u000a в System.Runtime.Serialization.ObjectManager.RegisterObject (Object obj, Int64 objectID, информация SerializationInfo, Int64 idOfContainingObj, член MemberInfo, Int32 [] arrayIndex) \ u000d \ u000a в System.Runtime.Serialization.Formatters.Binary.ObjectReader.RegisterObject (Object obj, ParseRecord pr, ParseRecord objectPr, Boolean bIsString) \ u000d \ u000a в System.Runtime.Serialization.Formatters.Binary.ObjectReader. ParseObjectEnd (ParseRecord pr) \ u000d \ u000a в System.Runtime.Serialization.Formatters.Binary.ObjectReader.Parse (ParseRecord pr) \ u000d \ u000a в System.Runtime.Serialization.Formatters.Binary .__ BinaryParser.Run() \ u000d \ u000a в System.Runtime.Seri alization.Formatters.Binary.ObjectReader.Deserialize (обработчик HeaderHandler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, метод IMethodCallMessageCallMessage) \ u000d \ u000a в System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (Stream serializationStream, обработчик HeaderHandler, Boolean fCheck, Boolean isCrossAppDomain, метод IMethodCallMessageCallMessage) \ u000d \ u000a в PostSharp.Aspects.Serialization.BinaryAspectSerializer.Deserialize (поток потока, IMetadataDispenser metadataDispenser) \ u000d \ u000a на PostSharp.Aspects.Serialization.AspectSerializer.Deserialize (сборка сборки, String resourceName , IMetadataDispenser metadataDispenser) \ u000d \ u000a в PostSharp.ImplementationDetails_fd2023ff. <> z__a_2..cctor() in: line 0 "," Type ":" System.InvalidCastException "}," Message ":" Инициализатор типа для PostSharp.ImplementationDetails_fd2023ff. <> z__a_2 'выбрал исключение. "," StackTrace ":" в PostSharp.ImplementationDetails_fd2023ff. <> z__a_1..cctor() in: line 0 "," Type ":" System.TypeInitializationException "}," Message ":" Инициализатор типа для PostSharp.ImplementationDetails_fd2023ff. <> z__a_1 'выбрал исключение. "," StackTrace ":" в PostSharp.ImplementationDetails_fd2023ff. <> z__a_1.Initialize() \ u000d \ u000a в AOS.BrokerAPI.WCFService.BrokerAPIService..cctor() в: строка 0 "," Тип ":" System.TypeInitializationException "}," Сообщение ":" Инициализатор типа для «AOS.BrokerAPI.WCFService.BrokerAPIService» выбрал исключение. »,« StackTrace »:« в AOS.BrokerAPI.WCFService.BrokerAPIService..ctor() \ u000d \ u000a в CreateAOS.BrokerAPI.WCFService.BrokerAPIService() \ u000d \ u000a в System.ServiceModel.Dispatcher.InstanceProvider.GetInstance (экземпляр экземпляра instanceContext, сообщение сообщения) \ u000d \ u000a в System.ServiceModel.Dispatcher.InstanceBehavior.GetInstance (экземпляр экземпляраContext, запрос сообщения) \ u000d \ u000a в System.ServiceModel.InstanceContext. GetServiceInstance (Message message) \ u000d \ u000a в System.ServiceModel.Dispatcher.InstanceBehavior.EnsureServiceInstance (MessageRpc & rpc) \ u000d \ u000a в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41 (MessageRpc & RPC) \ u000d \ u000a в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc & RPC) \ u000d \ u000a в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31 (MessageRpc & RPC) \ u000d \ u000a в System.ServiceModel. Dispatcher.ImmutableDispatchRuntime.ProcessMessage3 (MessageRpc & rpc) \ u000d \ u000a в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2 (MessageRpc & rpc) \ u000d \ u000a в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11 (MessageRpc & RPC) \ u000d \ u000a в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1 (MessageRpc & RPC) \ u000d \ u000a в System.ServiceModel.Dispatcher.MessageRpc.Process (Boolean isOperationContextSet) " "Тип":" System.TypeInitializationException "}," ExceptionType ":« System.TypeInitializationException »,« Сообщение »:« Инициализатор типа для «AOS.BrokerAPI.WCFService.BrokerAPIService» выбрал исключение. »,« StackTrace »:« в AOS.BrokerAPI. WCFService.BrokerAPIService..ctor() \ u000d \ u000a в CreateAOS.BrokerAPI.WCFService.BrokerAPIService() \ u000d \ u000a в System.ServiceModel.Dispatcher.InstanceProvider.GetInstance (экземпляр экземпляра instanceContext, сообщение сообщения) \ u000d \ u000a в системе. ServiceModel.Dispatcher.InstanceBehavior.GetInstance (экземпляр экземпляра instanceContext, запрос сообщения) \ u000d \ u000a в System.ServiceModel.InstanceContext.GetServiceInstance (сообщение сообщения) \ u000d \ u000a в System.ServiceMod el.Dispatcher.InstanceBehavior.EnsureServiceInstance (MessageRpc & RPC) \ u000d \ u000a в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41 (MessageRpc & RPC) \ u000d \ u000a в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc & RPC) \ u000d \ u000a в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31 (MessageRpc & RPC) \ u000d \ u000a в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3 (MessageRpc & RPC) \ u000d \ u000a в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime .ProcessMessage2 (MessageRpc & rpc) \ u000d \ u000a в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11 (MessageRpc & rpc) \ u000d \ u000a в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessM essage1 (MessageRpc & RPC) \ u000d \ u000a в System.ServiceModel.Dispatcher.MessageRpc.Process (Boolean isOperationContextSet) "}

Есть ли способ, что я могу обойти это?

Мой код выглядит следующим образом

Service Aspect

[Serializable] 
public class ServiceAspect : OnMethodBoundaryAspect 
{ 
    //create logger 

    private static readonly log4net.ILog log = LogManager.GetLogger(typeof(BrokerServiceAspect).Name);// 

    public override void OnException(MethodExecutionArgs args) 
    { 
     log.Error(args.Exception.Message, args.Exception);//log specific type of error 
     args.FlowBehavior = FlowBehavior.Return;//return excution 

     if (args.Exception is NullReferenceException) 
     { 
      args.ReturnValue = new FaultException(BrokerFaultCodes.NullExceptionCode); 
     } 
     else if (args.Exception is Exception) 
     { 
      args.ReturnValue = new FaultException(BrokerFaultCodes.GenericException); 
     } 
    } 
} 

И применять его на классе

[ServiceAspect(AttributeTargetElements = MulticastTargets.Method)] 
[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any, InstanceContextMode = InstanceContextMode.PerCall,IncludeExceptionDetailInFaults = true)] 
public class APIService : ServiceBase,IAPIService 
{ 

, как только я удаляю сервисный аспект из своего кода, он работает так, как ожидалось.

EDIT

Установка [OnMethodBoundaryAspectConfiguration(SerializerType = typeof(MsilAspectSerializer))] для замены [Сериализуемый атрибут теперь возвращает

Я думал об этом, но проблема в том, что служба не запускается из-за [Serializable] атрибут на ServiceAspect. Изменение сериализуемая атрибут [OnMethodBoundaryAspectConfiguration(SerializerType = typeof(MsilAspectSerializer))] возвращает Method not found: 'Void API.Model.Infrastructure.Aspect.ServiceAspect.OnException(PostSharp.Aspects.MethodExecutionArgs

ответ

2

Пожалуйста, посмотрите на это discussion. Кажется, у вас могут быть две разные версии PostSharp.dll в вашем проекте.

+0

Спасибо, что решил мою проблему, у меня была новая версия postsharp, запущенная в моем проекте Domain, в то время как предыдущий проект выполнялся на моем пользовательском интерфейсе, так что в DLL возник конфликт. – mahlatse