/// <summary> /// 将 RunContext 的当前实例重设为 null,该方法一般与 InitCurrent 成对使用。 /// </summary> public static void ResetCurrent() { current = null; }
private static RunContext GetFromRequest() { RunContext runContext; // 经测试,访问 1亿次 HttpContext.Current 用时 6 秒左右,每次 0.6 时间刻度(即2万分之一毫秒),完全不需要担心判断它是否存在会有性能问题 System.Web.HttpContext httpContext = System.Web.HttpContext.Current; if (httpContext != null) { runContext = httpContext.Items["_RunContext"] as RunContext; if (runContext == null) { runContext = new RunContext(); System.Web.HttpRequest httpRequest = httpContext.TryGetRequest(); if (httpRequest != null) { if (httpRequest.Url.DnsSafeHost.StartsWith("demo.", StringComparison.InvariantCultureIgnoreCase)) { runContext.contextRunMode = RunMode.Demo; } } httpContext.Items["_RunContext"] = runContext; } return runContext; } // 经测试,访问 1亿次 System.ServiceModel.OperationContext.Current 用时 5 秒左右,每次 0.5 时间刻度(即2万分之一毫秒),完全不需要担心判断它是否存在会有性能问题 System.ServiceModel.OperationContext operationContext = System.ServiceModel.OperationContext.Current; if (operationContext != null) { runContext = OperationContextExtension.GetItem(operationContext, "_RunContext") as RunContext; if (runContext == null) { runContext = new RunContext(); int headerIndex = operationContext.IncomingMessageHeaders.FindHeader(XMS.Core.WCF.DemoHeader.Name, XMS.Core.WCF.DemoHeader.NameSpace); if (headerIndex >= 0) { if (operationContext.IncomingMessageHeaders.GetHeader<bool>(headerIndex)) { runContext.contextRunMode = RunMode.Demo; } else { runContext.contextRunMode = RunMode.Release; } } else { if (operationContext.IncomingMessageProperties.ContainsKey(HttpRequestMessageProperty.Name)) { HttpRequestMessageProperty requestMessageProperty = operationContext.IncomingMessageProperties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty; if (requestMessageProperty != null) { if ("true".Equals(requestMessageProperty.Headers.Get(XMS.Core.WCF.DemoHeader.Name))) { runContext.contextRunMode = RunMode.Demo; } else { runContext.contextRunMode = RunMode.Release; } } } } OperationContextExtension.RegisterItem(operationContext, "_RunContext", runContext); } return runContext; } // 即不存在服务上下文又不存在http上下文时,返回本地运行上下文(local)。 return local; }
/// <summary> /// 从请求中初始化 Current 属性,这可将 RunContext 当前实例初始化化,后续对 Current 属性的访问不再依赖于具体的请求上下文,可避免访问已经释放的 OperationContext.Current 时发生错误, /// 并可提高后续访问的性能,但必须在执行结束时成对调用 ResetCurrent 方法,以防止在线程被复用时误用之前的上下文实例。 /// </summary> public static void InitCurrent() { current = GetFromRequest(); }