月度归档:2013年05月

Asp.net Routing UrlRewrite

void Application_Start(object sender, EventArgs e)
{
    //调用 RegisterRoutes() 来注册 Url 路由
    RegisterRoutes(RouteTable.Routes);
}
 
private static void RegisterRoutes(RouteCollection routes)
{
    IRouteHandler rssRouteHandler = new RssRouteHandler();
 
    //对于 /rss-type-num 这种规则的 Url 会转到 rssRouteHandler 实例来处理
    routes.Add(new Route("rss-{type}-{num}", rssRouteHandler));
 
    //可以调用 Add 注册多个路由项,还可以使用正则表达式
    //比如下面,Url 为 /rss/type/num/2010-02-12/2010-8-9 转到 rssRouteHandler 来处理
    routes.Add(new Route("rss/{type}/{num}/{dateStart}/{dateEnd}",
                new RouteValueDictionary(),
                new RouteValueDictionary(
                   new { dateStart = @"\d{4}-\d{1,2}-\d{1,2}", dateEnd = @"\d{4}-\d{1,2}-\d{1,2}" }
                ), rssRouteHandler));
}

using System.Web; using System.Web.Routing; /// <summary> /// Summary description for RssRouteHandler /// </summary> public class RssRouteHandler : IRouteHandler { public IHttpHandler GetHttpHandler(RequestContext requestContext) { return new RssProvider(requestContext); } }

using System; using System.Web; using System.Web.Routing; /// <summary> /// Summary description for RssProvider /// </summary> public class RssProvider : IHttpHandler { public RequestContext RequestContext { get; private set; } public RssProvider(RequestContext context) { this.RequestContext = context; } //暂且让它只处理 /rss-type-num 规则的 Url public virtual void ProcessRequest(HttpContext context) { string type = RequestContext.RouteData.Values["type"].ToString(); int num = Int32.Parse(RequestContext.RouteData.Values["num"].ToString()); //比如可以转换出实际 URI 去执行 //context.Server.Execute("rss.aspx?type="+type+"&num="+num); context.Response.Write("Type: " + type +" ; " + "Number: " + num + "<br/>"); context.Response.Write("根据上面条件设置响应头,输出需要的 RSS 数据。"); } public bool IsReusable { get { return false; } } }

配置 IIS6 使其他未知请求类型也由 Asp.Net 来处理

如果是在 Visual Studio 2008 的调试环境可以不作此配置,自动支持。

对于 IIS 7 也不需要作特别的设置。XP 环境的 IIS6 和 Win2003 下的 IIS6 配置还略有不同:

Win2003 下 IIS6 配置:Default Web Site 的属性,Home Directory 标签页里,Configuation...,为

Wildcard application maps(order of implementation) Insert 一项,

指向到 c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,不勾

选 Verify that file exists. XP 下的 IIS6 配置:虚拟目录的属性页(不是 Default Web Site Properties 了), Virtual Directory 标

签页中,点 Configuration 按钮,Maapings, 点 Add 按钮,Add/Edit Application Extensiona Mapping 窗口

里,Executable 里选择 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll,Extension 里填 .*,然后不选 Check that file exists,确定就行了。这样就完成了,通过 /rss-type-num 或 /rss/type/num/dateStart/dateEnd 就会执行到 RssProvider  的 ProcessRequest() 方法中,这样就完成了真实 Url 的重写,也能实现不需要 aspx 文件处理 Http 请求

C# Redis

引用:ServiceStackRedis

static void Main(string[] args)
 {
	 var Redis = new RedisClient(“127.0.0.1″, 6379);//redis服务IP和端口
	 #region =insert=
	 //var storeMembers = new List<string> { ”jj”, ”lihui”, ”cc” };
	 //storeMembers.ForEach(x => Redis.AddItemToList(“additemtolist”, x));
	 //注:也可直接使用AddRangeToList方法将一组数据装入如:
	 //Redis.AddRangeToList(“additemtolist”, storeMembers);
	 #endregion
	  #region =get=
	  //var members = Redis.GetAllItemsFromList(“additemtolist”);
	  //members.ForEach(s => Console.WriteLine(“additemtolist :” + s));
	  //Console.WriteLine(Redis.GetItemFromList(“additemtolist”, 2));
	  #endregion
	  #region =delete=
	  //var list = Redis.Lists["additemtolist"];
	  //list.Clear();//清空
	  //list.Remove(“two”);//移除指定键值
	  //list.RemoveAt(2);//移除指定索引位置数据
	  #endregion
	  #region =object=
	  //Redis.Set(“userinfo”, new UserInfo() { UserName = ”李四”, Age = 45 });
	  //UserInfo userinfo = Redis.Get<UserInfo>(“userinfo”);
	  //Console.WriteLine(userinfo.UserName);
	  //Redis.Set<int>(“my_age”, 12);//或Redis.Set(“my_age”, 12);
	  //Console.WriteLine(Redis.Get<int>(“my_age”));
	  #endregion
	  var ser = new ObjectSerializer();    //位于namespace ServiceStack.Redis.Support;
	  #region =序列化=
	  //bool result = Redis.Set<byte[]>(“userinfo”, ser.Serialize(new UserInfo() { UserName = ”张三”, Age = 12 }));
	  //UserInfo userinfo = ser.Deserialize(Redis.Get<byte[]>(“userinfo”)) as UserInfo;
	  //Console.WriteLine(userinfo.UserName);
	  #endregion
	  //也支持列表
	  //Redis.Set<byte[]>(“userinfolist_serialize”, ser.Serialize(userinfoList));
	  #region =负载均衡=
	  PooledRedisClientManager prcm = CreateManager(new string[] { “10.0.4.210:6379″ }, new string[] { “10.0.4.210:6379″ });
	  List<UserInfo> userinfoList = new List<UserInfo>();
	  userinfoList.Add(new UserInfo() { UserName = “pool_daizhj”, Age = 1 });
	  userinfoList.Add(new UserInfo() { UserName = “pool_daizhj1″, Age = 2 });
	  // 从池中获取一个链接:
	  using (IRedisClient Redis2 = prcm.GetClient())
	  {
		  Redis2.Set(“userinfolist”, userinfoList);
		  List<UserInfo> userList = Redis2.Get<List<UserInfo>>(“userinfolist”);
	  }
	  #endregion
	  Console.ReadLine();
  }
  public static PooledRedisClientManager CreateManager(string[] readWriteHosts, string[] readOnlyHosts)
  {
	  //支持读写分离,均衡负载
	  return new PooledRedisClientManager(readWriteHosts, readOnlyHosts, new RedisClientManagerConfig
	  {
		  MaxWritePoolSize = 5,//“写”链接池链接数
		  MaxReadPoolSize = 5,//“写”链接池链接数
		  AutoStart = true,
	  });
  }

static void Main(string[] args)
{
   var Redis = new RedisClient(“127.0.0.1″, 6379);//redis服务IP和端口

   #region =insert=

   //var storeMembers = new List<string> { ”jj”, ”lihui”, ”cc” };
   //storeMembers.ForEach(x => Redis.AddItemToList(“additemtolist”, x));
   //注:也可直接使用AddRangeToList方法将一组数据装入如:

   //Redis.AddRangeToList(“additemtolist”, storeMembers);
   #endregion

   #region =get=

   //var members = Redis.GetAllItemsFromList(“additemtolist”);
   //members.ForEach(s => Console.WriteLine(“additemtolist :” + s));
   //Console.WriteLine(Redis.GetItemFromList(“additemtolist”, 2));
   #endregion

   #region =delete=

   //var list = Redis.Lists["additemtolist"];
   //list.Clear();//清空
   //list.Remove(“two”);//移除指定键值
   //list.RemoveAt(2);//移除指定索引位置数据
   #endregion
   #region =object=

   //Redis.Set(“userinfo”, new UserInfo() { UserName = ”李四”, Age = 45 });
   //UserInfo userinfo = Redis.Get<UserInfo>(“userinfo”);
   //Console.WriteLine(userinfo.UserName);

   //Redis.Set<int>(“my_age”, 12);//或Redis.Set(“my_age”, 12);
   //Console.WriteLine(Redis.Get<int>(“my_age”));
   #endregion

   var ser = new ObjectSerializer();    //位于namespace ServiceStack.Redis.Support;
   #region =序列化=
	//bool result = Redis.Set<byte[]>(“userinfo”, ser.Serialize(new UserInfo() { UserName = ”张三”, Age = 12 }));
	//UserInfo userinfo = ser.Deserialize(Redis.Get<byte[]>(“userinfo”)) as UserInfo;
	//Console.WriteLine(userinfo.UserName);
	#endregion

	//也支持列表
	//Redis.Set<byte[]>(“userinfolist_serialize”, ser.Serialize(userinfoList));

	#region =负载均衡=

	PooledRedisClientManager prcm = CreateManager(new string[] { “10.0.4.210:6379″ }, new string[] { “10.0.4.210:6379″ });
	List<UserInfo> userinfoList = new List<UserInfo>();
	userinfoList.Add(new UserInfo() { UserName = “pool_daizhj”, Age = 1 });
	userinfoList.Add(new UserInfo() { UserName = “pool_daizhj1″, Age = 2 });

	// 从池中获取一个链接:

	using (IRedisClient Redis2 = prcm.GetClient())
	{
		Redis2.Set(“userinfolist”, userinfoList);
		List<UserInfo> userList = Redis2.Get<List<UserInfo>>(“userinfolist”);
	}

	#endregion
	Console.ReadLine();
}
public static PooledRedisClientManager CreateManager(string[] readWriteHosts, string[] readOnlyHosts)
{
	//支持读写分离,均衡负载
	return new PooledRedisClientManager(readWriteHosts, readOnlyHosts, new RedisClientManagerConfig
	{
		MaxWritePoolSize = 5,//“写”链接池链接数
		MaxReadPoolSize = 5,//“写”链接池链接数
		AutoStart = true,
	});
}

dos 当前日期写出文件

set datetime=%Date:~0,4%%Date:~5,2%%Date:~8,2%%Time:~0,2%%Time:~3,2%%Time:~6,2%

 

:: 过滤掉因10点前时间出现的空格,如: 20130613 91337,将其空格替为0

set datetime=%datetime: =0% 

 

echo %datetime%>c:\datetime.txt

bat批处理日期时间格式设置使用

bat批处理日期时间格式设置使用小结。

@echo off
@title 字符串的编辑测试(下面描述用的箭头→ ← 分别表示向右、向左的意思)
set aa=1234567890
echo 说明:下面复合变量中,逗号前的数字表示指针偏移量,逗号后的数字表示提取的字符长度
echo %aa:~1,5% //指针向右→偏移1位,然后从指针处开始向右→提取5个字符.
echo %aa:~0,-3% //指针不偏移,→提取所有字符,并除去最后3个字符.
echo %aa:~5% //单个数字,不指定长度值.表示指针→偏移5个字符,然后,→提取所有字符.
echo %aa:~-5% //单个负值,特例,表示指针反方向偏移,从最右端起,←偏移5位,然后从指针处开始→提取所有字符.也可以简单理解为提取字符串末尾5个字符.

echo 指针反方向偏移的情况.既是从字符串最右端起自右向左偏移.←

echo %aa:~-2,1% //偏移量取负值,表示指针从最右端起,向左←偏移2位,然后从指针处开始向右→提取1个字符,生成新的变量值.注意字符串末尾的空格,因为空格也将作为"透明字符"提取到变量中去,切记要去掉变量末尾的空格.ctrl+A即可快速方便的检查该变量字符串末端是否含有空格.
echo %aa:~-4,3% //最右端起,指针←偏移4位,然后→提取3个字符.
echo %aa:~-4,-2% //从最右端起,指针←偏移4位,然后从指针处开始,→提取所有字符,并去除最后2个字符.

echo 应用
echo %date:~0,10% //提取年月日信息
echo %date:~-3% //提取星期几信息
echo %time:~0,5% //提取时间中的时和分
echo %time:~0,-3% //提取时和分和秒信息
pause

小结:

1、偏移量为正值时,表示指针向右移动;为负值时,表示指针从字符串最右端起向左移动.

2、如果长度值为正,表示向右提取若干个字符;如果为负,表示向右提取所有字符,并去除若干个字符.”若干个=长度值的绝对值。”提取字符的方向总是自左向右进行的.

3、如果为单个数字,那么这个数字表示的是偏移量,长度值取默认值,既是字符串的”余数”,也就是从指针处开始,向右方向的所有字符.如果这个数字是负数,可以简单的理解为:提取字符串末尾的若干个字符.(正确的解释应该是:表示指针反方向偏移,从最右端起,←偏移若干位,然后从指针处开始→提取所有字符)

%date%和%time%是系统内置的日期变量和时间变量。

set date=%Date:~0,4%%Date:~5,2%%Date:~8,2%%Time:~0,2%%Time:~3,2%%Time:~6,2%

%Date:~0,4%表示年,以此类推

显示的格式为:20120712105610

DOS日期格式设置

%date% 和 %time%

2011-10-21 21:34:11.56

C:\>echo %date%

2011-10-21 星期二

C:\>echo %date:~0,4%

2011

盘符:\>输出 %date%是一个参数 但是他后面带的这些就是取值范围,说说后面的数值第一个0代表从头开始 后面的4代表共取4个字符

C:\>echo %date:~-3%

星期三

这里面的负数代表倒数,也就取最后3个字符

C:\>echo %date:~-3,-1%

星期

这里的-1是不输出最后1个字符-2当然是2个类推

time也类似

echo %time%

21:34:11.56

DOS命令 Date和Time

一、DATA日期设置命令

功能:设置或显示系统日期。

类型:内部命令

格式:Date[mm-dd-yy]

使用说明:

(1)省略[mm-dd-yy]显示系统日期并提示输入新的日期,不修改则可直接按回车键,[mm-dd-yy]为“月月-日日-年年”格式;

(2)当机器开始启动时,有自动处理文件(AUTOEXEC.BAT)被执行,则系统不提示输入系统日期。否则,提示输入新日期和时间。

实例:

查看当前系统的日期,直接输入date即可。

二、TIME系统时钟设置命令

功能:设置或显示系统时期。

类型:内部命令

格式:TIME[hh:mm:ss:xx]

使用说明:

(1)省略[hh:mm:ss:xx],显示系统时间并提示输入新的时间,不修改则可直接按回车键,[hh:mm:ss:xx]为“小时:分钟:秒:百分之几秒”格式;

(2)当机器开始启动时,有自动处理文件(AUTOEXEC.BAT)被执行,则系统不提示输入系统日期。否则,提示输入新日期和时间。

vbs操作windows服务

开启
'***************************************************************************

'Set strComputer = "."

'Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")

'Set objSWbemServices = objSWbemLocator.ConnectServer _
'    (strComputer, "root\cimv2", "fabrikam\administrator", "password")
'objSWbemServices.Security_.ImpersonationLevel = 3

Set objSWbemServices = GetObject("winmgmts:{impersonationLevel=impersonate}!\.\root\CIMV2\administrator\Password")

Set ServiceSet = objSWbemServices.ExecQuery("select * from Win32_Service where Name='服务名'")

for each Service in ServiceSet
 RetVal = Service.StartService()
 if RetVal = 0 then WScript.Echo "Service started"
 if RetVal = 10 then WScript.Echo "Service already running"
next
 

停止
'***************************************************************************

'Set strComputer = "."

'Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")

'Set objSWbemServices = objSWbemLocator.ConnectServer _
'    (strComputer, "root\cimv2", "fabrikam\administrator", "password")
'objSWbemServices.Security_.ImpersonationLevel = 3

Set objSWbemServices = GetObject("winmgmts:{impersonationLevel=impersonate}!\.\root\CIMV2\administrator\Password")

Set ServiceSet = objSWbemServices.ExecQuery("select * from Win32_Service where Name='服务名'")

for each Service in ServiceSet
 RetVal = Service.StopService()
 if RetVal = 0 then 
  WScript.Echo "Service stopped" 
 elseif RetVal = 5 then 
  WScript.Echo "Service already stopped" 
 end if
next

Socket笔记

1、  为了增加效率,可以考虑采用无异常的函数
.net2.0Socket.Send,Socket.Receive 有了无异常的函数
Socket.Send(Byte[], Int32, Int32, SocketFlags, SocketError)
Socket.Receive(Byte[], Int32, Int32, SocketFlags, SocketError)
减少不必要的异常,就等于增加效率。

2Socket.Connected 不是当前的Socket状态
MSDN
原文:获取一个值,该值指示 Socket 是在上次 Send 还是 Receive 操作时连接到远程主机。
应当如何解决呢?

同样MSDN也告诉了我们:
Connected
属性的值反映最近操作时的连接状态。如果您需要确定连接的当前状态,请进行非阻止、零字节的 Send 调用。 如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035),则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。
3
、要用Socket.Poll判断是否可以接收,不要用Socket.Available
虽然Socket.Available可以偷窥到当前Recv缓冲区字节数,而且AvailablePoll速度的两倍,但是MSDN说到:如果远程主机使用 Shutdown 方法关闭了 Socket 连接,并且所有可用数据均已收到,则 Receive 方法将立即完成并返回零字节。
所以当网络断开的时候单纯使用Socket.Available判断是否recv到数据会存在不知道客户端已经断开Bug
补充:不推荐使用Socket.PollSocket的列表遍历,应当使用Socket.Select(或者其他模型),Socket.Poll是对Socket.Select的封装,执行Socket.Poll耗时是非阻塞Socket.Recv的三倍。
4
、非阻塞模式不能采用Receive的返回值表示是否断开
3条说道:如果远程主机使用 Shutdown 方法关闭了 Socket 连接,并且所有可用数据均已收到,则 Receive 方法将立即完成并返回零字节。但这并不能阻塞模式说明Socket已经断开,这一条和Crecv函数不同,需要特别注意。需要判断out出来的SocketError,当不为SocketError.SuccessSocketError.InterruptedSocketError.WouldBlock时就可以认为网络已经断开。
5
Send可能出现缓冲区满的情况
判断out出来的SocketError,如果等于SocketError.WouldBlock,则是Send缓冲区已满,应断开该Socket,否则影响整体速度,而不应当again, 反过来说允许的错误码只有SocketError.Interrupted,此时可以重来一次。
6
、主动断开Socket
MSDN说道:如果当前使用的是面向连接的 Socket,则必须先调用 Shutdown 方法,然后才能关闭 Socket。这可以确保在已连接的套接字关闭之前,已发送和接收该套接字上的所有数据。
所以,网络库的Close函数可以封装为先调用 Shutdown(SocketShutdown.Both),在调用Close()
7
Socket已经关闭(Close)但不能在另一端断开
一端Scoket已经关闭了,但另一端短时间内仍可以发送数据!这个问题还没有找到解决办法的,但原因已知,在《Windows网络编程技术》一书(P139-P140)中说道:被动关闭的情况下,应用程序会从对方那里接收一个FIN包,并用一个ACK包做出响应。此时,应用程序的套接字会变成ClOSE_WAIT状态。由于对方已关闭自己的套接字,所以不能再发送数据了。但应用程序却不同,它能一直发送数据,直到对方的套接字已关闭为止。

SVN 冲突 树冲突

经常有人会说,树冲突是很难解决的一类冲突,其实一旦了解了其原理,要解决也不难。先回顾下对于树冲突的定义。

    树冲突:当一名开发人员移动、重命名、删除一个文件或文件夹,而另一名开发人员也对它们进行了移动、重命名、删除或者仅仅是修改时就会发生树冲突。
出现冲突时,一般会提示冲突的信息是什么。过后我们可以使用svn st来查看当前状态。svn st的各种状态代表什么,请参考此博文svn st状态详解
先介绍一下概念

Delete : 其中目录结构变化,都认为是Delete

Edit: 是指修改文件

Local : 是你本地修改

Incoming :是别人修改,你要Update或Merge进来。

这样应该有4个组合,但是Edit对Edit的组合应该是File Conflict,这个容易解决,不在Tree Conflict 讨论范围,所以有3种组合。再需要区别Update和Merge,就有了6种情况。分别是

Local delete, incoming edit upon update
Local edit, incoming delete upon update
Local delete, incoming delete upon update
Local missing, incoming edit upon merge
Local edit, incoming delete upon merge
Local delete, incoming delete upon merge
分别对这几种情形解释如下:
1.Local delete, incoming edit upon update(本地删除,更新后传入修改)
产生原因:1.A修改文件Foo.c后提交到版本库中,B将Foo.c重命名为Bar.c或者删除了Foo.c或者直接将Foo.c的父目录Foo直接删除 2.B更新工作副本会提示该冲突,在working copy显示为Foo.c在本地删除,被标记为冲突。如果是重命名,则Bar.c被标记为新增,但是不包括A的修改。
解决:A与B要确认是否采用A的修改与是否重命名。如果采用A的修改,并且要重命名则修改后,标记冲突解决,svn resolved,最后提交;如果不采用A的修改,直接标记冲突解决提交即可。
2.Local edit, incoming delete upon update (本地编辑,更新后传入删除)
产生原因:1.A对Foo.c重命名为Bar.c并提交到版本库(或者A将Foo.c的上级目录Foo修改为Bar),B在他的工作副本中对Foo.c进行修改。2.B提交前更新,会提示如此错误。
解决:同样需要两个人进行协商后修改。
3.Local delete, incoming delete upon update (本地删除,更新后传入删除)
产生原因:1.A将Foo.c重命名为Bar.c后提交,B对Foo.c重命名为Bix.c。2.B更新本地工作副本是会提示该树冲突。
解决:通过日志查找文件被删除即重命名的原因,A与B协商后最终确认采用哪个名称。
4.Local missing, incoming edit upon merge (本地丢失,合并后传入修改)
产生原因:1.A在主干上修改Foo.c,B在分支上将Foo.c重命名为Bar.c。2.B合并A在主干上的修改。
解决:B先标记冲突解决,然后将Foo.c拷贝至本地,将A的修改合并至自己的文件中或者直接放弃A的修改,采用自己的修改。
5.Local edit, incoming delete upon merge (本地修改,合并后传入删除)
产生原因:1.A将Foo.c重命名为Bar.c(或者将Foo.c的父目录Foo改为Bar),B在分支上修改Foo.c。2.B合并A的修改时提示该冲突。Bar.c被标记为增加,Foo.c被标记为冲突。
解决:同样根据日志查找到修改的源头,两人协商后解决。
6.Local delete, incoming delete upon merge (本地删除,合并后传入删除)
产生原因:1.A在主干上将Foo.c重命名为Bar.c,B在分支上将Foo.c重命名为Bix.c。2.B合并A的修改时会提示冲突。重命名后的文件被标记为新增,原来文件被标记为树冲突。
解决:通过日志查找到文件被改名的时刻,两人协商后解决。

 

二、 2

1、将冲突文件目录重命名,重新更新,
2、将冲突文件 svn resolved
3、svn commit

谷歌给出的解决办法参考:
1、http://blog.csdn.net/hantiannan/article/details/5306194
Eclipse内SVN 右击工程目录–>team–>Show Tree Conflict–>在Eclpise中会出现一个Tab视图显示Tree Conflict的内容,一个一个选择列表中的冲突右击将其标志为已解决,然后回到项目再提交更改就可以了。

2、http://eyejava.iteye.com/blog/356109 (更详细办法)