У меня есть индивидуальный аспект, который я пытаюсь добавить в свою службу, чтобы автоматически регистрировать всю ошибку и отправлять соответствующее сообщение об ошибке, но когда я пытаюсь применить ее к классу и установить 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
Спасибо, что решил мою проблему, у меня была новая версия postsharp, запущенная в моем проекте Domain, в то время как предыдущий проект выполнялся на моем пользовательском интерфейсе, так что в DLL возник конфликт. – mahlatse