IIS 7 でのオブジェクトの比較では理解できない、非常に奇妙な問題があります。古い IIS 6 ベースの ASP.NET アプリケーションを IIS 7 に展開しようとしていますが、等価比較の問題が発生しています。分からないようです。
まず、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)) %>
<% } %>
ここに私の結果があります:
IIS6:
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:
ジョンの質問に答えるために。2 つのコレクションは、NHibernate を使用してロードされます。しかし、IIS 6 と IIS 7 の両方がアプリケーションのまったく同じビルドを使用していることを繰り返し述べなければならないと感じています。 Google で何かを検索しても、どうすればよいかわかりません。
これは、2 つのエンティティ オブジェクトを比較するときのシステム全体の問題でもあります。したがって、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
更新 3:
これも何か関係があるのかもしれません: IIS7 でウィンザー城に http モジュールを登録するのを忘れたようです