Exemple #1
0
		/// <summary>
		/// 将 RunContext 的当前实例重设为 null,该方法一般与 InitCurrent 成对使用。
		/// </summary>
		public static void ResetCurrent()
		{
			current = null;
		}
Exemple #2
0
		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;
		}
Exemple #3
0
		/// <summary>
		/// 从请求中初始化 Current 属性,这可将 RunContext 当前实例初始化化,后续对 Current 属性的访问不再依赖于具体的请求上下文,可避免访问已经释放的 OperationContext.Current 时发生错误,
		/// 并可提高后续访问的性能,但必须在执行结束时成对调用 ResetCurrent 方法,以防止在线程被复用时误用之前的上下文实例。
		/// </summary>
		public static void InitCurrent()
		{
			current = GetFromRequest();
		}