2016-03-29 3 views
1

Ich habe einen benutzerdefinierten Aspekt Ich versuche, zu meinem Dienst hinzufügen, um alle Fehler automatisch zu protokollieren und eine entsprechende Fehlermeldung senden, aber wenn ich versuche, es auf die Klasse anzuwenden und zu setzen Attributetargetelement zu Multicast.method oder es an die einzelnen Verfahren anwenden, gibt meinen Dienst einen 500-Fehler mit FehlermeldungPostsharp Methodboundry Aspekt funktioniert nicht mit WCF Service-Klasse

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": { "Help": null, "Innerexception": { "Help ": null," InnerException ": {" HelpLink ": null," InnerException ": {" HelpLink ": null," InnerException ": null," Nachricht ":" Objekt kann nicht in einem Array dieses Typs gespeichert werden. " "StackTrace": "bei System.Array.InternalSetVal Ue (Void * target, Objektwert) \ u000d \ u000a at System.Array.SetValue (Objektwert, Int32 [] -Indizes) \ u000d \ u000a at System.Runtime.Serialization.ObjectManager.CompleteObject (ObjectHolder holder, Boolean bObjectFullyComplete) \ u000d \ u000a bei System.Runtime.Serialization.ObjectManager.DoNewlyRegisteredObjectFixups (ObjectHolder-Inhaber) \ u000d \ u000a bei System.Runtime.Serialization.ObjectManager.RegisterObject (object obj, Int64-Objekt-ID, SerializationInfo-Info, Int64-idOfContainingObj, MemberInfo-Member, Int32 [] arrayIndex) \ u000d \ u000a bei System.Runtime.Serialization.Formatters.Binary.ObjectReader.RegisterObject (Object Obj, ParseRecord pr, ParseRecord objectPr, Boolean bIsString) \ u000d \ u000a bei System.Runtime.Serialization.Formatters.Binary.ObjectReader. ParseObjectEnd (ParseRecord pr) \ u000d \ u000a bei System.Runtime.Serialization.Formatters.Binary.ObjectReader.Parse (ParseRecord pr) \ u000d \ u000a bei System.Runtime.Serialization.Formatters.Binary .__ BinaryParser.Run() \ u000d \ u000a bei System.Runtime.Seri alization.Formatters.Binary.ObjectReader.Deserialize (HeaderHandler-Handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) \ u000d \ u000a bei System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (Stream serializationStream, HeaderHandler-Handler, Boolesch fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) \ u000d \ u000a bei PostSharp.Aspects.Serialization.BinaryAspectSerializer.Deserialize (Stream-Stream, IMetadataDispenser metadataDispenser) \ u000d \ u000a bei PostSharp.Aspects.Serialization.AspectSerializer.Deserialize (Assembly assembly, String resourceName , IMetadataDispenser metadataDispenser) \ u000d \ u000a bei PostSharp.ImplementationDetails_fd2023ff. <> z__a_2..cctor() in: Zeile 0 "," Type ":" System.InvalidCastException "}," Nachricht ":" Der Typinitialisierer für 'PostSharp.ImplementationDetails_fd2023ff. <> z__a_2 'hat eine Ausnahme ausgelöst. "," StackTrace ":" bei PostSharp.ImplementationDetails_fd2023ff. <> z__a_1..cctor() in: Zeile 0 "," Type ":" System.TypeInitializationException "}," Nachricht ":" Der Typinitialisierer für 'PostSharp.ImplementationDetails_fd2023ff. <> z__a_1 'hat eine Ausnahme ausgelöst. "," StackTrace ":" bei PostSharp.ImplementationDetails_fd2023ff. <> z__a_1.Initialize() \ u000d \ u000a bei AOS.BrokerAPI.WCFService.BrokerAPIService..cctor() in: Zeile 0 "," Type ":" System.TypeInitializationException "}," Nachricht ":" Der Typinitialisierer für 'AOS.BrokerAPI.WCFService.BrokerAPIService' hat eine Ausnahme ausgelöst. "," StackTrace ":" unter AOS.BrokerAPI.WCFService.BrokerAPIService..ctor() \ u000d \ u000a bei CreateAOS.BrokerAPI.WCFService.BrokerAPIService() \ u000d \ u000a bei System.ServiceModel.Dispatcher.InstanceProvider.GetInstance (InstanceContext instanceContext, Nachricht) \ u000d \ u000a at System.ServiceModel.Dispatcher.InstanceBehavior.GetInstance (InstanceContext instanceContext, Message-Anforderung) \ u000d \ u000a at System.ServiceModel.InstanceContext. GetServiceInstance (Nachricht Nachricht) \ u000d \ u000a bei System.ServiceModel.Dispatcher.InstanceBehavior.EnsureServiceInstance (MessageRpc & rpc) \ u000d \ u000a bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41 (MessageRpc & rpc) \ u000d \ u000a bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc & rpc) \ u000d \ u000a bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31 (MessageRpc & rpc) \ u000d \ u000a bei System.ServiceModel. Dispatcher.ImmutableDispatchRuntime.ProcessMessage3 (MessageRpc & RPC) \ u000d \ u000a bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2 (MessageRpc & RPC) \ u000d \ u000a bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11 (MessageRpc & rpc) \ u000d \ u000a bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1 (MessageRpc & rpc) \ u000d \ u000a bei System.ServiceModel.Dispatcher.MessageRpc.Process (Boolean isOperationContextSet) "," Type ":" System.TypeInitializationException "}," ExceptionType ":" System.TypeInitializationException "," Message ":" Der Typinitialisierer für 'AOS.BrokerAPI.WCFService.BrokerAPIService' hat eine Ausnahme ausgelöst. "," StackTrace ":" bei AOS.BrokerAPI. " WCFService.BrokerAPIService..ctor() \ u000d \ u000a bei CreateAOS.BrokerAPI.WCFService.BrokerAPIService() \ u000d \ u000a bei System.ServiceModel.Dispatcher.InstanceProvider.GetInstance (InstanceContext instanceContext, Nachricht) \ u000d \ u000a bei System. ServiceModel.Dispatcher.InstanceBehavior.GetInstance (InstanceContext instanceContext, Nachrichtenanforderung) \ u000d \ u000a at System.ServiceModel.InstanceContext.GetServiceInstance (Nachrichtennachricht) \ u000d \ u000a at System.ServiceMod el.Dispatcher.InstanceBehavior.EnsureServiceInstance (MessageRpc & RPC) \ u000d \ u000a bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41 (MessageRpc & RPC) \ u000d \ u000a bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc & RPC) \ u000d \ u000a bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31 (MessageRpc & RPC) \ u000d \ u000a bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3 (MessageRpc & RPC) \ u000d \ u000a bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime .ProcessMessage2 (MessageRpc & rpc) \ u000d \ u000a bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11 (MessageRpc & rpc) \ u000d \ u000a bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessM essage1 (MessageRpc & rpc) \ u000d \ u000a bei System.ServiceModel.Dispatcher.MessageRpc.Process (Boolean isOperationContextSet) "}

Gibt es eine Weise, die ich dieses Problem umgehen kann?

My-Code ist wie folgt

Dienst 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); 
     } 
    } 
} 

Und es von der Klasse Anwendung

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

Sobald ich den Service-Aspekt aus meinem Code entferne, funktioniert es wie erwartet.

EDIT

[OnMethodBoundaryAspectConfiguration(SerializerType = typeof(MsilAspectSerializer))] einstellen [Serializable-Attribut jetzt zu ersetzen kehrt

Ich habe darüber nachgedacht, aber das Problem ist, dass der Dienst nicht wegen des Attributs [Serializable] startet auf dem ServiceAspect. Ändern des serializable Attribut [OnMethodBoundaryAspectConfiguration(SerializerType = typeof(MsilAspectSerializer))] gibt Method not found: 'Void API.Model.Infrastructure.Aspect.ServiceAspect.OnException(PostSharp.Aspects.MethodExecutionArgs

Antwort

2

Bitte einen Blick auf diese discussion haben. Es scheint, dass Sie zwei verschiedene Versionen von PostSharp.dll in Ihrem Projekt haben können.

+0

Danke, dass mein Problem gelöst wurde, hatte ich eine neue Version von Postsharp auf meinem Domain-Projekt ausgeführt, während ein früheres Projekt auf meiner Benutzeroberfläche ausgeführt wurde, so gab es einen Konflikt auf der DLL. – mahlatse

Verwandte Themen