void InitializeCallContextCore(MessageRpc rpc)
        {
            IClientChannel channel = rpc.Channel.Proxy as IClientChannel;
            int            offset  = Parent.CallContextCorrelationOffset;

            try
            {
                for (int i = 0; i < rpc.Operation.CallContextInitializers.Length; i++)
                {
                    ICallContextInitializer initializer = CallContextInitializers[i];
                    rpc.Correlation[offset + i] = initializer.BeforeInvoke(rpc.InstanceContext, channel, rpc.Request);
                }
            }
            catch (Exception e)
            {
                if (Fx.IsFatal(e))
                {
                    throw;
                }
                if (ErrorBehavior.ShouldRethrowExceptionAsIs(e))
                {
                    throw;
                }
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperCallback(e);
            }
        }
Example #2
0
        public ServiceAuthorizationBehaviorAttribute(PrincipalPermissionMode principalPermissionMode, string roleProviderName = "")
        {
            switch (principalPermissionMode)
            {
            case PrincipalPermissionMode.UseWindowsGroups:
            {
                this.CallContextInitializer = new WindowsAuthorizationCallContextInitializer();
                break;
            }

            case PrincipalPermissionMode.UseAspNetRoles:
            {
                if (string.IsNullOrEmpty(roleProviderName))
                {
                    this.CallContextInitializer = new AspRoleAuthorizationCallContextInitializer(Roles.Provider);
                }
                else
                {
                    this.CallContextInitializer = new AspRoleAuthorizationCallContextInitializer(Roles.Providers[roleProviderName]);
                }
                break;
            }

            case PrincipalPermissionMode.Custom:
            {
                throw new ArgumentException("只有UseWindowsGroups和UseAspNetRoles模式被支持!");
            }
            }
        }
Example #3
0
        /// <summary>
        /// Allows the config file to specify an OutOfBand DataContract for a give service.
        /// </summary>
        /// <remarks>
        /// It is better to explicitly place an OutOfband(typeof(...)) attribute on any ServiceContract that will be using an OutOfBand parameter
        /// so that the requirements of the contract are entirely imperative.  However, a config-based approach can be used to upgrade legacy code
        /// without touching it or allow services to act as an OutOfBand pass-through without knowing it.
        /// </remarks>
        /// <param name="serviceDescription"></param>
        /// <param name="serviceHostBase"></param>
        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
        {
            ICallContextInitializer initializer = context == null ? null : CreateGenericInitializer();

            foreach (var endpoint in serviceHostBase.ChannelDispatchers.SelectMany(cd => ((ChannelDispatcher)cd).Endpoints).Where(e => !e.IsSystemEndpoint))
            {
                foreach (var operation in endpoint.DispatchRuntime.Operations)
                {
                    if (context != null)
                    {
                        if (order > -1)
                        {
                            operation.CallContextInitializers.Insert(order, initializer);
                        }
                        else
                        {
                            operation.CallContextInitializers.Add(initializer);
                        }
                    }
                    else
                    {
                        foreach (var header in contexts)
                        {
                            initializer = CreateGenericInitializer(header.RequireContext, header.HeaderType, header.Headername);
                            operation.CallContextInitializers.Add(initializer);
                        }
                    }
                }
            }
        }
Example #4
0
        public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
        {
            ICallContextInitializer initializer = CreateGenericInitializer();

            foreach (var operation in dispatchRuntime.Operations)
            {
                if (order > -1)
                {
                    operation.CallContextInitializers.Insert(order, initializer);
                }
                else
                {
                    operation.CallContextInitializers.Add(initializer);
                }
            }
        }
        void UninitializeCallContextCore(MessageRpc rpc)
        {
            IClientChannel channel = rpc.Channel.Proxy as IClientChannel;
            int            offset  = Parent.CallContextCorrelationOffset;

            try
            {
                for (int i = CallContextInitializers.Length - 1; i >= 0; i--)
                {
                    ICallContextInitializer initializer = CallContextInitializers[i];
                    initializer.AfterInvoke(rpc.Correlation[offset + i]);
                }
            }
            catch (Exception e)
            {
                // thread-local storage may be corrupt
                DiagnosticUtility.FailFast(string.Format(CultureInfo.InvariantCulture, "ICallContextInitializer.BeforeInvoke threw an exception of type {0}: {1}", e.GetType(), e.Message));
            }
        }
 public LoggingBehavior(LoggingCallContextInitializer loggingCallContextInitializer)
 {
     _loggingCallContextInitializer = loggingCallContextInitializer;
 }
Example #7
0
 public LoggingBehavior(LoggingCallContextInitializer loggingCallContextInitializer)
 {
     _loggingCallContextInitializer = loggingCallContextInitializer;
 }