10月 29

一个服务,总是莫名其妙的卡主,不知道卡在了什么地方,最近也没时间修复。

每次都是通过重启来搞定的,时间长了有点烦

所以打算给整个方法设置执行上限,超过时长则自动重启

网上找了下,发现还是用的TPL做的

 

记录一下代码

        static void Main(string[] args)
        {

            var tokenSource = new CancellationTokenSource();
            CancellationToken token = tokenSource.Token;
            int timeOut = 5000; // 5ms

            var task = Task.Factory.StartNew(() => TargetMethod(), token);

            if (!task.Wait(timeOut, token))
            {
                  Console.WriteLine("The Task timed out!"); 
            } 
        }

        public static object TargetMethod()
        {
            for (int index = 0; index < 100; index++)
            {
                Thread.Sleep(300);
                Console.WriteLine(index);
            }
            return null;
        }

written by ocean

10月 11

以前在做webform的时候,url控制都是自己在httphandler里面写的

打算新开一个站,用mvc的方式,因为规划有多个二级域名,而不是子目录,所以研究了一下mvc的路由配置方式,特此记录

配置形式如下

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");


            routes.Add("weixin", new DomainRoute("weixin.zuotu5.com", "{action}", new { controller = "WeiXin", action = "Index" }));
            routes.Add("zhifubao", new DomainRoute("zhifubao.zuotu5.com", "{action}", new { controller = "ZhiFuBao", action = "Index" }));
            routes.Add("qq", new DomainRoute("qq.zuotu5.com", "{action}", new { controller = "QQ", action = "Index" }));
            routes.Add("tucao", new DomainRoute("tucao.zuotu5.com", "{action}", new { controller = "PeiZi", action = "Index" }));
            routes.Add("www", new DomainRoute("zuotu5.com", "{action}", new { controller = "WWW", action = "Index" }));

        }
    }

如此,便配置了5个二级域名

其中用到了类DomainRoute,

    public class DomainRoute : Route
    {
        private Regex domainRegex;
        private Regex pathRegex;

        public string Domain { get; set; }

        public DomainRoute(string domain, string url, RouteValueDictionary defaults)
            : base(url, defaults, new MvcRouteHandler())
        {
            Domain = domain;
        }

        public DomainRoute(string domain, string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
            : base(url, defaults, routeHandler)
        {
            Domain = domain;
        }

        public DomainRoute(string domain, string url, object defaults)
            : base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
        {
            Domain = domain;
        }

        public DomainRoute(string domain, string url, object defaults, IRouteHandler routeHandler)
            : base(url, new RouteValueDictionary(defaults), routeHandler)
        {
            Domain = domain;
        }

        public override RouteData GetRouteData(HttpContextBase httpContext)
        {
            // 构造 regex
            domainRegex = CreateRegex(Domain);
            pathRegex = CreateRegex(Url);

            // 请求信息
            string requestDomain = httpContext.Request.Headers["host"];
            if (!string.IsNullOrEmpty(requestDomain))
            {
                if (requestDomain.IndexOf(":") > 0)
                {
                    requestDomain = requestDomain.Substring(0, requestDomain.IndexOf(":"));
                }
            }
            else
            {
                requestDomain = httpContext.Request.Url.Host;
            }
            string requestPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo;

            // 匹配域名和路由
            Match domainMatch = domainRegex.Match(requestDomain);
            Match pathMatch = pathRegex.Match(requestPath);

            // 路由数据
            RouteData data = null;
            if (domainMatch.Success && pathMatch.Success)
            {
                data = new RouteData(this, RouteHandler);

                // 添加默认选项
                if (Defaults != null)
                {
                    foreach (KeyValuePair<string, object> item in Defaults)
                    {
                        data.Values[item.Key] = item.Value;
                        if (item.Key.Equals("area") || item.Key.Equals("Namespaces"))
                        {
                            data.DataTokens[item.Key] = item.Value;
                        }
                    }
                }

                // 匹配域名
                for (int i = 1; i < domainMatch.Groups.Count; i++)
                {
                    Group group = domainMatch.Groups[i];
                    if (group.Success)
                    {
                        string key = domainRegex.GroupNameFromNumber(i);

                        if (!string.IsNullOrEmpty(key) && !char.IsNumber(key, 0))
                        {
                            if (!string.IsNullOrEmpty(group.Value))
                            {
                                data.Values[key] = group.Value;
                                if (key.Equals("area"))
                                {
                                    data.DataTokens[key] = group.Value;
                                }
                            }
                        }
                    }
                }

                // 匹配路径
                for (int i = 1; i < pathMatch.Groups.Count; i++)
                {
                    Group group = pathMatch.Groups[i];
                    if (group.Success)
                    {
                        string key = pathRegex.GroupNameFromNumber(i);

                        if (!string.IsNullOrEmpty(key) && !char.IsNumber(key, 0))
                        {
                            if (!string.IsNullOrEmpty(group.Value))
                            {
                                data.Values[key] = group.Value;
                                if (key.Equals("area"))
                                {
                                    data.DataTokens[key] = group.Value;
                                }
                            }
                        }
                    }
                }
            }

            return data;
        }

        public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
        {
            return base.GetVirtualPath(requestContext, RemoveDomainTokens(values));
        }

        public DomainData GetDomainData(RequestContext requestContext, RouteValueDictionary values)
        {
            // 获得主机名
            string hostname = Domain;
            foreach (KeyValuePair<string, object> pair in values)
            {
                if (pair.Key == "area" && string.IsNullOrEmpty(pair.Value.ToString()))
                {
                    hostname = hostname.Replace("{" + pair.Key + "}", "www");
                }
                else
                {
                    hostname = hostname.Replace("{" + pair.Key + "}", pair.Value.ToString());
                }
            }

            //如果域名的area还没有被替换,说明路由数据里没有area,恢复为顶级域名
            if (hostname.Contains("{area}"))
            {
                hostname = hostname.Replace("{area}", "www");
            }

            RemoveDomainTokens(values);

            // Return 域名数据
            return new DomainData
            {
                Protocol = "http",
                HostName = hostname,
                Fragment = ""
            };
        }

        private Regex CreateRegex(string source)
        {
            // 替换
            source = source.Replace("/", @"\/?");
            source = source.Replace(".", @"\.?");
            source = source.Replace("-", @"\-?");
            source = source.Replace("{", @"(?<");
            source = source.Replace("}", @">([a-zA-Z0-9_]*))");

            return new Regex("^" + source + "$");
        }

        private RouteValueDictionary RemoveDomainTokens(RouteValueDictionary values)
        {
            Regex tokenRegex = new Regex(@"({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?");
            Match tokenMatch = tokenRegex.Match(Domain);
            for (int i = 0; i < tokenMatch.Groups.Count; i++)
            {
                Group group = tokenMatch.Groups[i];
                if (group.Success)
                {
                    string key = group.Value.Replace("{", "").Replace("}", "");
                    if (values.ContainsKey(key))
                        values.Remove(key);
                }
            }

            return values;
        }
    }

    public class DomainData
    {
        public string Protocol { get; set; }
        public string HostName { get; set; }
        public string Fragment { get; set; }
    }

written by ocean \\ tags:

10月 06

手里一张光大银行的卡,每次网上买东西都是404报错

今天突发奇想,百度了一下才发现是因为我用的英文操作系统所以出现的问题,难道光大银行这样的集团IT系统都不做测试的吗

 

记录一下解决方法

 

在大部分用户眼里,无论你使用的是什么语言的浏览器版本,访问任何语言的网站应该都是没有任何问题的。不过有时候国内的网站就是这么奇葩,当你使用英文版的IE浏览器访问国内的某些网站时,居然会出现无法正常访问的情况,还提示404错误。本以为是浏览器本地的错误,让尝试清除了浏览器缓存,没有任何作用。访问别的网站没有任何问题,最终确定错误是网站服务端的问题。

问题重现步骤:

  1. 浏览器语言设置为非中文(比如英文),Windows 8通过控制面板的语言首选项设置Language List

  2. 打开支付宝或者财付通,选择用光大银行的网银充值(不是快捷支付或一点通)

  3. 页面跳转到光大银行网银支付系统,马上抛出Error–404错误

然后电话给客服,最终确认为“浏览器语言设置不正确”。难道浏览器语言设置还有所谓正确与不正确么?我装的Windows 8是英文版的,默认语言也是英文,IE10也是英文版的。

幸好最后摸索到解决办法了。

  1. 打开Internet Options,第一个选项卡最下面Appearance里面点击Languages,弹出的小窗口中点击Set Languages Preferences.

  2. 这下在弹出的控制面板的Language窗口中选择左侧的Advanced settings.

  3. 滚动条拉到最下面,勾选上Don’t let website access my language list.(如下图所示的选项),然后保存。

  4. 回到Language的控制面板,选择左侧的Change date, time or number formats,确保这个里面选择的都是Chinese, China什么的。然后保存。

  5. 最后重启IE即可。

written by ocean