我有一个非常奇怪的问题,我无法通过比较 IIS 7 上的对象来解决。我们正在在 IIS 7 上部署基于 IIS 6 的旧 ASP.NET 应用程序,但是我们有这个相等比较问题,我们可以似乎没有弄清楚。
首先让我说我在 IIS 6 和 IIS 7 上都运行相同的程序集和代码,但是对象的比较与 IIS 6 和 IIS 7 上的相同代码不同。这是我的示例对象看起来像:
class Country : EntityBase {
public int CountryID { get; set; }
public string Name { get; set; }
public override bool Equals(object obj) {
if (obj == null || !(obj is Country))
return false;
Country c = (Country)obj;
return CountryID == c.CountryID;
}
public override int GetHashCode() {
return CountryID.GetHashCode();
}
}
我在 IIS 6 和 IIS 7 的 ASPX 页面中都有以下代码:
<% foreach(var country in proposalCountries) { %>
<%= country.Country.CountryID %>
<%= country.Country.CountryID.GetHashCode() %>
<%= country.Country.GetHashCode() %>
<%= proposalCountryServices.Count(c => c.Country == country.Country) %>
<%= proposalCountryServices.Count(c => (c.Country != null && country.Country != null) && c.Country.Equals(country.Country)) %>)
<%= proposalCountryServices.Count(c => Object.Equals(c.Country, country.Country)) %>
<% } %>
这是我的结果:
IIS 6:
100 <-- CountryID
100 <-- CountryID Hash Code
100 <-- Country Hash Code
1 <-- Something Found
1 <-- Something Found
1 <-- Something Found
IIS 7:
100 <-- CountryID
100 <-- CountryID Hash Code
100 <-- Country Hash Code
0 <-- Nothing Found
1 <-- Something Found
1 <-- Something Found
Windows 2003 和 Windows 2008 上的 .NET 3.5 SP1 有区别吗?我真的不知道问题可能是什么。有没有人遇到过类似的问题?
更新1:
回答乔恩的问题。这两个集合是使用 NHibernate 加载的。但我觉得我应该重申 IIS 6 和 IIS 7 都使用完全相同的应用程序构建,所以除非 NHibernate 或 DynamicProxy2 正在改变基于 Windows 2003 或 Windows 2007 的加载方式,我无法做到在谷歌上找到任何东西,我不知道该怎么做。
每当我比较我的两个实体对象时,这也是一个系统范围的问题。所以它可能与 DynamicProxy2 包装器有关,但两个对象都是 Country 对象,并且考虑到我创建的覆盖,一切都应该在 IIS 6 和 IIS 7 中相同。
更新 2:
这似乎是 DynamicProxy2 或 NHibernate 问题。因为我尝试了以下代码:
<%
var c1 = new ICost.Business.Entities.Country {
CountryID = 100
};
var c2 = new ICost.Business.Entities.Country {
CountryID = 100
};
%>
<%= c1.CountryID == c2.CountryID %>
<%= c1.GetHashCode() == c2.GetHashCode() %>
<%= c1.Equals(c2) %>
<%= Object.Equals(c1, c2) %>
<%= c1 == c2 %>
对于 IIS 6 和 IIS 7,结果都是, true
, true
, true
, . 请参阅下面的答案,了解我为解决此问题所做的工作。true
false