March 26
这几天,我家宝宝一直赖在老妈肚子里面,不出来。害得我每天上班都提心吊胆的,也没有工作热情。就等着宝宝出生,可是他就是赖着不出来。
于是,就把公司电脑重装成了中文版的Win2008。 安装一些软件过程中碰到了不少问题,特意整理成这篇博客,让后来着少走弯路。
一、显卡驱动的问题
我电脑的显卡是:NVIDIA GeForce 6200 TurboCache。
GeForce 系列的显卡,在Window2008 下,最新的驱动反而不能用。 安装了最新的驱动后,你的显示器就会黑屏,没有任何治了。最新版本的 169.32,虽然说通过了Vista 的WHQL认证,还是直接黑屏。更不要说其他版本的了。
网上也有其他型号的 GeForce 也碰到了这个问题。我碰到这个问题后,反复试验了多个版本的驱动,一直不行。最后在使用下面版本的驱动后,才搞定。下面版本的是32位操作系统的驱动。
http://www.nvidia.com/object/winvista_x86_96.85.html
网上也有人碰到类似问题,不过他的显卡是:NVIDIA QUADRO NVS 280(PCI-E)
参考以下帖子:
http://www.hwtest.cn/redirect.php?tid=1828&goto=lastpost
二、MSN无法使用的问题
微软新发布的Windows Live Messenger 8.5正式版和微软服务器家族不兼容,Windows Server 2003和Windows Server 2008操作系统在安装MSN时会出现如下的错误提示,很抱歉,Windows Live程序不能安装在Windows Server、Windows XP x94 或早于Windows XP SP3的操作系统中 。
我的解决方法就是安装的: Version 8.1 (Build 8.1.0178.0) ,要求是完全安装包的那种。另外,注意它提示升级时候,你不要升级。
网上这个版本的下载地址很多,比如下面链接:
http://www.skycn.com/article/5351.html
三、Windows Live Writer 无法使用的问题
同样上面的原因,Win2008也不支持 Live Writer。 能够使用的 Live Writer 版本必须是完整安装包的,我用的是下面地址下载的完整安装包,版本号:12.0.1366.1026
http://download.pchome.net/internet/tools/detail-14598.html
四、VS2008的MSDN,可以多个版本并存
之前我记得在微软中国VS团队征求意见时候,我就提到一个意见,中文MSDN的翻译,有些让人摸不着头脑。为此,我宁可使用英文版的。现在可以中英文并存,可以很好的解决这个问题。
安装了Win2008后的第一感觉,很多日常小软件都需要特殊配置后才能使用。Win2008在没有必要的情况下,最好不要做开发用机。需要考虑的问题多多。毕竟这是一个新的服务器操作系统。而不是PC操作系统。
March 12
现象
我们编码实现请求一个页面时,请求的代码类似如下代码:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strUrl);
req.UserAgent = "MSIE6.0";
req.Method = "GET";
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
StreamReader sr = new StreamReader(res.GetResponseStream(), strEncode);
strHtml = sr.ReadToEnd();
sr.Close();
res.Close();
但是,如果我们请求的这个页面正好是一个有异常发生的页面,或者不存在的页面。我们上面的代码就会在
req.GetResponse();
这里抛出异常:远程服务器返回错误: (500) 内部服务器错误。
我们通过上面的代码,是不能得到错误发生时候的页面源代码的。
分析原因:
(HttpWebResponse)req.GetResponse(); 这行代码中做了如下一件事情:
当服务器段ASP.net程序有 Exception 发生时,客户端应用程序接受了HTTP 协议错误后。把这个HTTP 协议错误转换成 Status 设置为 WebExceptionStatus.ProtocolError 的 WebException,并且把这个异常throw出来。
解决问题
那如果我们想获得错误发生时候服务器段错误页面的源代码该如何做呢?
其实非常非常简单的做法,我们用下面的代码就不论错误发生与否,都可以获得服务器段页面的源代码。
HttpWebResponse res;
try
{
res = (HttpWebResponse)req.GetResponse();
}
catch (WebException ex)
{
res = (HttpWebResponse)ex.Response;
}
StreamReader sr = new StreamReader(res.GetResponseStream(), strEncode);
strHtml = sr.ReadToEnd();
当异常发生事后,WebException 中不仅有 StatusCode 标志着 HTTP 的错误代码,而且它的 Response 属性还包含由服务器发送的 WebResponse,
来指示遇到的实际 HTTP 错误。
这个问题的解决方法是这么的简单,但是我碰到这个问题后,通过Google、baidu搜索,竟然很多人不知道。所以整理这篇博客,帮助被这个问题困挠的人。
附,HttpWebRequest 的派生关系图:
System.Object
System.MarshalByRefObject
System.Net.WebRequest
System.IO.Packaging.PackWebRequest
System.Net.FileWebRequest
System.Net.FtpWebRequest
System.Net.HttpWebRequest
参考:
使用WEBCLIENT如何获得错误页面?
http://topic.csdn.net/t/20061030/17/5120137.html
March 05
不知你有没有留意过ASP.net的异常,如下图:

请留意图中用红笔标的地方。那些数字标明出错处位于源代码文件的多少行。
但是,我们通过 Exception.StackTrace 是获得不了这个信息的。这个信息是如何获得呢?这就要用到下面两个类:
| System.Diagnostics.StackTrace | 表示一个堆栈跟踪,它是一个或多个堆栈帧的有序集合。 |
| System.Diagnostics.StackFrame | 表示当前线程的调用堆栈中的一个函数调用 |
下面的代码就替我们扑捉了更多关于异常的信息:
public static string EnhancedStackTrace(Exception ex)
{
return EnhancedStackTrace(new StackTrace(ex, true));
}
public static string EnhancedStackTrace(StackTrace st)
{
StringBuilder sb = new StringBuilder();
sb.Append(Environment.NewLine);
sb.Append("---- Stack Trace ----");
sb.Append(Environment.NewLine);
for (int i = 0; i < st.FrameCount; i++)
{
StackFrame sf = st.GetFrame(i);
MemberInfo mi = sf.GetMethod();
sb.Append(StackFrameToString(sf));
}
sb.Append(Environment.NewLine);
return sb.ToString();
}
public static string StackFrameToString(StackFrame sf)
{
StringBuilder sb = new StringBuilder();
int intParam;
MemberInfo mi = sf.GetMethod();
sb.Append(" ");
sb.Append(mi.DeclaringType.Namespace);
sb.Append(".");
sb.Append(mi.DeclaringType.Name);
sb.Append(".");
sb.Append(mi.Name);
// -- build method params
sb.Append("(");
intParam = 0;
foreach (ParameterInfo param in sf.GetMethod().GetParameters())
{
intParam += 1;
sb.Append(param.Name);
sb.Append(" As ");
sb.Append(param.ParameterType.Name);
}
sb.Append(")");
sb.Append(Environment.NewLine);
// -- if source code is available, append location info
sb.Append(" ");
if (string.IsNullOrEmpty(sf.GetFileName()))
{
sb.Append("(unknown file)");
//-- native code offset is always available
sb.Append(": N ");
sb.Append(String.Format("{0:#00000}", sf.GetNativeOffset()));
}
else
{
sb.Append(System.IO.Path.GetFileName(sf.GetFileName()));
sb.Append(": line ");
sb.Append(String.Format("{0:#0000}", sf.GetFileLineNumber()));
sb.Append(", col ");
sb.Append(String.Format("{0:#00}", sf.GetFileColumnNumber()));
if (sf.GetILOffset() != StackFrame.OFFSET_UNKNOWN)
{
sb.Append(", IL ");
sb.Append(String.Format("{0:#0000}", sf.GetILOffset()));
}
}
sb.Append(Environment.NewLine);
return sb.ToString();
}
一个扑捉的信息如下:
---- Stack Trace ----
WebErrorTestProject.WebForm1.Page_Load(sender As Objecte As EventArgs)
WebForm_GetError.aspx.cs: line 0018, col 13, IL 0016
System.Web.Util.CalliHelper.EventArgFunctionCaller(fp As IntPtro As Objectt As Objecte As EventArgs)
(unknown file): N 00015
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(sender As Objecte As EventArgs)
(unknown file): N 00033
System.Web.UI.Control.OnLoad(e As EventArgs)
(unknown file): N 00099
System.Web.UI.Control.LoadRecursive()
(unknown file): N 00047
System.Web.UI.Page.ProcessRequestMain(includeStagesBeforeAsyncPoint As BooleanincludeStagesAfterAsyncPoint As Boolean)
(unknown file): N 01436
这个扑捉的信息,还包含源代码文件,行号,列号。
通过这些错误信息,可以帮助我们更容易的解决问题。