Postsharp Methodbounddry方面无法与WCF服务类一起使用



我有一个自定义方面,我正试图添加到我的服务中,以自动记录所有错误并发送适当的错误消息,但当我尝试将其应用于类并将Attributetargetelements设置为Multicast.method或应用于单个方法时,我的服务返回一个500错误,错误消息为

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":null,"InnerException":{。","StackTrace":"在System.Array.InternalSetValue(Void*target,Object value)\u000d\u000a(位于System.Array.SetValue(Object value,Int32[]index)\u000 d\u000 a(位于System.Runtime.Serialization.ObjectManager.CompleteObject(ObjectHolder holder,Boolean bObjectFullyComplete)\u 000d\u 000a(处于System.Runtime.Serialization.ObjectManager.DoNewlyRegisteredObjectFixups(ObjectHolderholder)\u 000 d\u 000 aSystem.Runtime.Serialization.ObjectManager.RegisterObjectSystem.Runtime.Serialization.Formatters.Binary.ObjectReader.ParseObjectEnd(HeaderHandler处理程序,__BinaryParser serParser,布尔值fCheck,布尔值isCrossAppDomain,IMethodCallMessage methodCallMessage)\u000d\u000a在System.Runtime.Serialization.Formatters.BinaryFormatter.Descialize(流序列化流,HeaderHandler处理程序,布尔值f Check,布尔型isCrossAppDomain,IMethod CallMessage methodCallMessage)\u000d\u000a在PostSharp.Aspect.Serialization.BinaryAspectSerializer.Deserialize(流流,IMetadataDispenser元数据分配器)\u000d\u000a,位于PostSharp.aspect.Serialization。AspectSerialiser.Deserilize(程序集程序集,字符串资源名称,IMetadata分配器元数据分配器)\u000d\u000,位于PostSharp.ImplementationDetails_fd2023ff<>z__a_2..cctor()位于:第0行","Type":"System.InvalidCastException"},"Message":"PostSharp.ImplementationDetails_fd2023ff的类型初始值设定项<>z__a_2引发异常。","StackTrace":"位于PostSharp.ImplementationDetails_fd2023ff<>z__a_1..cctor()位于:第0行","Type":"System.TypeInitializationException"},"Message":"PostSharp.ImplementationDetails_fd2023ff的类型初始值设定项<>z__a_1引发异常。","StackTrace":"位于PostSharp.ImplementationDetails_fd2023ff<>位于AOS.BrokerAPI.WCFService.BrokerAPIService.ctor()的z__a_1.Initialize()\u000d\u000a,位于:第0行","Type":"System.TypeInitializationException"},"Message":"AOS.Broker API.WCFService的类型初始值设定项引发异常。","StackTrace":"位于System.ServiceModel.Dispatcher.InstanceProvider.GetInstance(InstanceContext InstanceContext,消息消息)\u000d\u000a,位于System.ServiceModel.Dispatcher的CreateAOS.BrokerAPI.WCFService.BrokerAPIService()\u000d\u000a\System.ServiceModel.InstanceContext.GetServiceInstance(消息消息)处的u000d\u000a System.ServiceModel.Dispatcher.InstanceBehavior.EnsureServiceInstance(MessageRpc&rpc(MessageRpc&rpc)\u000d\u000a在System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&rpcSystem.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&rpc)\u000d\u000a在System.ServiceModel.Dispatcher.ProcessMessageRpc.Process(Boolean isOperationContextSet)","Type":"System.TypeInitializationException"},"ExceptionType":"System.TypeInitialization Exception","Message":"AOS.BrokerAPI.WCFService.BrokerAPIService"的类型初始值设定项引发异常。","StackTrace":"位于System.ServiceModel.Dispatcher.InstanceProvider.GetInstance(InstanceContext InstanceContext,消息消息)\u000d\u000a,位于System.ServiceModel.Dispatcher的CreateAOS.BrokerAPI.WCFService.BrokerAPIService()\u000d\u000a\System.ServiceModel.InstanceContext.GetServiceInstance处的u000d\u000a(消息消息)System.ServiceModel.Dispatcher.Instance处的\u000d\u000

有办法绕过这一点吗

我的代码如下

服务方面

[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
{

一旦我从代码中删除了服务方面,它就会按预期工作。

编辑

设置[OnMethodBoundaryAspectConfiguration(SerializerType = typeof(MsilAspectSerializer))]以替换[Serializable属性现在返回

我已经考虑过了,但问题是由于ServiceAspect上的[Serializable]属性,服务没有启动。将可序列化属性更改为[OnMethodBoundaryAspectConfiguration(SerializerType = typeof(MsilAspectSerializer))]返回Method not found: 'Void API.Model.Infrastructure.Aspect.ServiceAspect.OnException(PostSharp.Aspects.MethodExecutionArgs

请看一下这次讨论。您的项目中可能有两个不同版本的PostSharp.dll。

最新更新