Frage

Ich habe ein wirklich seltsames Problem, das ich nicht herausfinden kann, um Objekte auf IIS 7 zu vergleichen 'Ich scheinen nicht herauszufinden.

Lassen Sie mich zunächst sagen, dass ich die gleichen Baugruppen und den gleichen Code habe, der sowohl auf IIS 6 als auch auf IIS 7 ausgeführt wird. Der Vergleich der Objekte unterscheidet sich jedoch sowohl auf IIS 6 als auch auf IIS 7 unterscheidet Objekt sieht aus wie:

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();
    }
}

Ich habe den folgenden Code in einer ASPX -Seite sowohl auf IIS 6 als auch auf IIS 7:

<% 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)) %>
<% } %>

Hier sind meine Ergebnisse:

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

Gibt es einen Unterschied zwischen .NET 3.5 SP1 unter Windows 2003 und Windows 2008? Ich bin wirklich nicht mehr verletzt, was das Problem sein könnte. Hat jemand ein ähnliches Problem erlebt?

Update 1:

Jons Frage zu beantworten. Die beiden Kollektionen werden mit Nhibernate geladen. Aber ich habe das Gefühl, ich sollte wiederholen, dass sowohl IIS 6 als auch IIS 7 die verwenden genau gleichermaßen Von der Anwendung, es sei denn, NhiberNate oder DynamicProxy2 ändert sich, wie die Dinge basierend auf Windows 2003 oder Windows 2007 geladen werden.

Dies ist auch ein systemweites Problem von immer dann, wenn ich zwei meiner Entitätsobjekte vergleiche. Es könnte also etwas mit dem DynamicProxy2 -Wrapper zu tun haben, aber beide Objekte sind Country -Objekte, und angesichts der Überschreibungen, die ich geschaffen habe, sollte alles in IIS 6 und IIS 7 gleich funktionieren.

Update 2:

Dies scheint ein DynamicProxy2- oder Nhibernate -Problem zu sein. Weil ich den folgenden Code ausprobiert habe:

<%
    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 %>

Und für IIS 6 und IIS 7 war das Ergebnis, true, true, true, true, false. Sehen Sie sich meine Antwort unten für das an, was ich getan habe, um dies zu lösen.

Update 3:

Dies hätte auch etwas damit zu tun haben:Sieht so aus, als hätten Sie vergessen, das HTTP -Modul mit Windsor Castle mit IIS7 zu registrieren

War es hilfreich?

Lösung 4

Dies ist die Lösung, die für mich funktioniert hat:

public static bool operator ==(BaseEntity a, BaseEntity b)
{
    return Object.Equals(a, b);
}

public static bool operator !=(BaseEntity a, BaseEntity b)
{
    return !Object.Equals(a, b);
}

Anscheinend hat Nhibernate oder DynamicProxy unter Windows 2003 eine Art Magie gemacht, um den Operator "==" dazu zu bringen, mit dem Operator zu arbeiten.

Andere Tipps

Sie haben nicht erklärt was proposalCountries und proposalCountryServices sind. Es sieht für mich so aus .

Bitte geben Sie Details darüber an, wie die beiden Sammlungen geladen werden - das ist wahrscheinlich die Ursache dafür.

Der Unterschied, den ich sehe, ist für den Fall, den Sie geschrieben haben

c.Country == country.Country

und falls es zwei ist

c.Country.Equals(country.Country))

Ich würde also vermuten, dass er im letzteren Fall erfolgreich ist, weil er im ersten Fall die Countryids beider Objekte vergleicht, aber er vergleicht die Objekte selbst.

Warum das unter IE6 funktioniert, weiß ich nicht ... Entschuldigung

Sie verwenden keine Referenzgleichheit (siehe unten).

Object.equals ruft eine überschriebene Equals -Methode für Ihren Typ auf.

Ich vermute, Sie haben verschiedene Instanzen der Entitäten aus verschiedenen DataContexts herausgezogen und einer Liste hinzugefügt und daher eine Überschreibung gleichgesetzt, um es zu versuchen, es funktioniert.

Aktualisieren:

Entschuldigung, nicht sicher, ob Sie LINQ2SQL verwenden.

Sie könnten das Problem wahrscheinlich beheben, indem Sie die Operatoren ==/! = Überschreiben, aber es gibt auch einige Überlegungen.

Update 2:

Um zu verstehen, was ich meine, finden Sie beide Fälle, die Sie für gleich halten (genau wo dieses Problem passiert). Setzen Sie einen Haltepunkt. GO & OBJ1 und Geben Sie & OBJ2 ein und geben Sie ein, Sie werden feststellen, dass sie auf verschiedene Objektadressen verweisen. Tun Sie dies sowohl auf IIS 6 als auch auf 7.

Ich bin mir nicht sicher, warum es sich auf IIS6 und IIS7 unterschiedlich verhält, aber ich vermute, dass subtile Unterschiede im Seitenlebenszyklus die Ursache sein könnten, warum sie nicht gleichberechtigt sind.

Update 3:

Laufen Sie im klassischen Modus in IIS7? Wenn nicht, versuchen Sie es.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top