最近碰到了一个IIS请求卡死的问题。页面可以正常加载,就是一发登陆请求就一直转圈无法继续了。把网站各种设置都检查了一遍,程序日志,系统日志都看了没发现一次,然后怀疑是服务器问题让重启服务器,重启服务器之后就好了。然而正式用了半天又不行了。一步步到请求方法写日志观察发现是获取服务器Mac地址导致的卡死。
证实在少数服务器存在使用一段时间后Windows Management服务出了问题导致通过WMI方式获取Mac的逻辑卡死
//WMI方式,有碰到电脑获取MAC卡死WMI,该方法依赖WMI的系统服务,该服务一般不会被关闭;但如果系统服务缺失或者出现问题,
//该方法无法取得MAC地址,需要重启Windows Management Instrumentation服务。
//ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
//ManagementObjectCollection moc2 = mc.GetInstances();
//foreach (ManagementObject mo in moc2)
//{
// if ((bool)mo["IPEnabled"] == true)
// {
// resMac = mo["MacAddress"].ToString();
// mo.Dispose();
// if (resMac == mac)
// {
// return true;
// }
// }
//}
改用NetworkInterface方式就行了
string resMac = "";
//通过NetworkInterface读取网卡Mac
NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface ni in interfaces)
{
resMac = ni.GetPhysicalAddress().ToString();
if (resMac == mac)
{
return true;
}
}
服务器用着用着网站就假死了,只有杀w3wp进程才回复的问题
经过多方测试发现如果C#代码用了析构函数,并且析构函数的逻辑抛出异常之后就会导致运用程序池假死。用析构抛异常百分百重现。