コード例 #1
0
        public object BeforeCall(string operationName, object[] inputs)
        {
            if (LogAction == null)
            {
                return null;
            }

            try
            {
                var operationContext = OperationContext.Current;
                var securityContext = ServiceSecurityContext.Current;
                var remoteEndpoint = OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name]
                                     as RemoteEndpointMessageProperty;

                var operationData = new OperationDetails
                                    {
                                        OperationName = operationName,
                                        Action = operationContext.IncomingMessageHeaders.Action,
                                        ServiceUri = operationContext.Channel.LocalAddress.Uri,
                                        ClientAddress = remoteEndpoint != null ? remoteEndpoint.Address : "",
                                        UserName = securityContext != null ? securityContext.PrimaryIdentity.Name : "",
                                        Identity = securityContext != null ? securityContext.PrimaryIdentity : null,
                                        IsAnonymous = securityContext == null || securityContext.IsAnonymous
                                    };

                if (inputs != null)
                {
                    // get parameter names
                    var parameterInfos = _operationDescription.SyncMethod.GetParameters();

                    // add enabled parameters
                    int i = 0;
                    foreach (var parameterInfo in parameterInfos.Where(x => IsParameterLoggingEnabled(x.Name)))
                    {
                        operationData.Parameters.Add(parameterInfo.Name, i < inputs.Length ? inputs[i] : null);
                        i++;
                    }
                }

                LogAction(operationData);
            }
            catch (Exception e)
            {
                // logging failed, try notifying the service
                var onError = OnError;
                if (onError != null)
                {
                    onError(e, string.Format("Operation logging failed for '{0}'", operationName));
                }
            }

            return null;
        }