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); } }
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模式被支持!"); } } }
/// <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); } } } } }
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; }
public LoggingBehavior(LoggingCallContextInitializer loggingCallContextInitializer) { _loggingCallContextInitializer = loggingCallContextInitializer; }