Web services 虚拟服务器IIS WMI问题
我的任务是找出这段代码出现问题的原因:Web services 虚拟服务器IIS WMI问题,web-services,iis,wmi,virtual-machine,Web Services,Iis,Wmi,Virtual Machine,我的任务是找出这段代码出现问题的原因: public static ArrayList GetEthernetMacAddresses() { ArrayList addresses = new ArrayList(); ManagementClass mc = new ManagementClass("Win32_NetworkAdapter"); // This causes GetInstances(options) // to return all s
public static ArrayList GetEthernetMacAddresses()
{
ArrayList addresses = new ArrayList();
ManagementClass mc = new ManagementClass("Win32_NetworkAdapter");
// This causes GetInstances(options)
// to return all subclasses of Win32_NetworkAdapter
EnumerationOptions options = new EnumerationOptions();
options.EnumerateDeep = true;
foreach (ManagementObject mo in mc.GetInstances(options)) {
string macAddr = mo["MACAddress"] as string;
string adapterType = mo["AdapterType"] as string;
if (!StringUtil.IsBlank(macAddr) && !StringUtil.IsBlank(adapterType))
{
if (adapterType.StartsWith("Ethernet")) {
addresses.Add(macAddr);
}
}
}
return addresses;
}
在我们的(Win2003)虚拟服务器上,当作为控制台应用程序的一部分运行,而不是从运行在IIS上的web服务(在同一台机器上)运行时,此功能可以工作
或者,我可以在IIS上的web服务(在虚拟服务器上)中使用此代码,并获得正确的返回值:
public static string GetMacAddresses()
{
ManagementClass mgmt = new ManagementClass(
"Win32_NetworkAdapterConfiguration"
);
ManagementObjectCollection objCol = mgmt.GetInstances();
foreach (ManagementObject obj in objCol)
{
if ((bool)obj["IPEnabled"])
{
if (sb.Length > 0)
{
sb.Append(";");
}
sb.Append(obj["MacAddress"].ToString());
}
obj.Dispose();
}
}
为什么第二个有效而第一个无效
为什么仅当通过虚拟机上的IIS web服务调用时
任何帮助都将不胜感激
更新:经过长时间的电话访问,获得了所有不同级别的MS支持,我们得出结论,这是“按设计的” 因为它是虚拟网络适配器驱动程序的驱动程序级别,所以答案是我们应该更改代码“以解决此问题”
这意味着您无法在虚拟服务器上可靠地测试代码,除非您使用的代码与在物理服务器上使用的代码相同,因为我们无法保证服务器是精确的副本…为什么这两个服务器返回的结果不同?由于用户帐户不同,您可能会从控制台和服务中获得不同的运行结果
为什么(1)失败,(2)工作?adapterType的空结果是否可能返回空值?如果是这样,代码会处理这种情况吗?为什么这两个函数返回不同的结果?由于用户帐户不同,您可能会从控制台和服务中获得不同的运行结果
为什么(1)失败,(2)工作?adapterType的空结果是否可能返回空值?如果是这样,代码会处理这种情况吗?好的,所以我写了这段代码来测试这个问题:
public void GetWin32_NetworkAdapter()
{
DataTable dt = new DataTable();
dt.Columns.Add("AdapterName", typeof(string));
dt.Columns.Add("ServiceName", typeof(string));
dt.Columns.Add("AdapterType", typeof(string));
dt.Columns.Add("IPEnabled", typeof(bool));
dt.Columns.Add("MacAddress", typeof(string));
//Try getting it by Win32_NetworkAdapterConfiguration
ManagementClass mgmt = new ManagementClass("Win32_NetworkAdapter");
EnumerationOptions options = new EnumerationOptions();
options.EnumerateDeep = true;
ManagementObjectCollection objCol = mgmt.GetInstances(options);
foreach (ManagementObject obj in objCol)
{
DataRow dr = dt.NewRow();
dr["AdapterName"] = obj["Caption"].ToString();
dr["ServiceName"] = obj["ServiceName"].ToString();
dr["AdapterType"] = obj["AdapterType"];
dr["IPEnabled"] = (bool)obj["IPEnabled"];
if (obj["MacAddress"] != null)
{
dr["MacAddress"] = obj["MacAddress"].ToString();
}
else
{
dr["MacAddress"] = "none";
}
dt.Rows.Add(dr);
}
gvConfig.DataSource = dt;
gvConfig.DataBind();
}
当它在物理IIS盒上运行时,我得到以下信息: 虚拟IIS服务器上的相同代码: 看到不同了吗?在第一行。虚拟服务器不返回“AdapterType”字符串。这就是原始代码失败的原因
这引出了一个有趣的想法。如果虚拟服务器应该是真实IIS服务器的“虚拟”表示,为什么它不返回相同的值?好的,所以我编写了以下代码来测试这个问题:
public void GetWin32_NetworkAdapter()
{
DataTable dt = new DataTable();
dt.Columns.Add("AdapterName", typeof(string));
dt.Columns.Add("ServiceName", typeof(string));
dt.Columns.Add("AdapterType", typeof(string));
dt.Columns.Add("IPEnabled", typeof(bool));
dt.Columns.Add("MacAddress", typeof(string));
//Try getting it by Win32_NetworkAdapterConfiguration
ManagementClass mgmt = new ManagementClass("Win32_NetworkAdapter");
EnumerationOptions options = new EnumerationOptions();
options.EnumerateDeep = true;
ManagementObjectCollection objCol = mgmt.GetInstances(options);
foreach (ManagementObject obj in objCol)
{
DataRow dr = dt.NewRow();
dr["AdapterName"] = obj["Caption"].ToString();
dr["ServiceName"] = obj["ServiceName"].ToString();
dr["AdapterType"] = obj["AdapterType"];
dr["IPEnabled"] = (bool)obj["IPEnabled"];
if (obj["MacAddress"] != null)
{
dr["MacAddress"] = obj["MacAddress"].ToString();
}
else
{
dr["MacAddress"] = "none";
}
dt.Rows.Add(dr);
}
gvConfig.DataSource = dt;
gvConfig.DataBind();
}
当它在物理IIS盒上运行时,我得到以下信息: 虚拟IIS服务器上的相同代码: 看到不同了吗?在第一行。虚拟服务器不返回“AdapterType”字符串。这就是原始代码失败的原因
这引出了一个有趣的想法。如果虚拟服务器应该是真实IIS服务器的“虚拟”表示,为什么它不返回相同的值?第一个错误会导致什么错误?没有错误,只是一个空的ArrayList。第一个错误会导致什么错误?没有错误,只是一个空的ArrayList。