Question

J'ai un problème vraiment étrange que je ne parviens pas à comparer les objets sur IIS 7. Nous sommes en train de déployer notre ancienne application ASP.NET basée sur IIS 6 sur IIS 7. Cependant, nous avons ce problème de comparaison d'égalité. que nous ne semblons pas comprendre.

Permettez-moi de commencer par dire que les mêmes assemblages et le même code fonctionnent à la fois sur IIS 6 et IIS 7, mais que la comparaison des objets diffère avec le même code, à la fois sous IIS 6 et IIS 7. Voici un exemple à quoi ressemble mon objet:

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

J'ai le code suivant dans une page ASPX à la fois sous IIS 6 et 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)) %>
<% } %>

Voici mes résultats:

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

Existe-t-il une différence entre .NET 3.5 SP1 sur Windows 2003 et Windows 2008? Je suis vraiment à court de ce que le problème pourrait être. Quelqu'un at-il rencontré un problème similaire?

Mise à jour 1:

Pour répondre à la question de Jon. Les deux collections sont chargées avec NHibernate. Mais j'estime devoir réitérer qu'IIS 6 et IIS 7 utilisent la version identique de l'application. Par conséquent, à moins que NHibernate ou DynamicProxy2 ne modifie le mode de chargement des éléments basé sur Windows 2003 ou Windows 2007, Je n'ai rien trouvé sur Google, je ne sais pas quoi en faire.

C’est également un problème qui concerne l’ensemble du système lorsque je compare deux de mes objets d’entité. Cela pourrait donc avoir quelque chose à voir avec l'encapsuleur DynamicProxy2, mais les deux objets sont des objets Pays et, étant donné les substitutions que j'ai créées, tout devrait fonctionner de la même manière dans IIS 6 et IIS 7.

Mise à jour 2:

Cela semble être un problème DynamicProxy2 ou NHibernate. Parce que j'ai essayé le code suivant:

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

Et pour IIS 6 et IIS 7, le résultat était vrai , vrai , vrai , vrai . , false . Voir ma réponse ci-dessous pour savoir ce que j'ai fait pour résoudre ce problème.

Mise à jour 3:

Cela pourrait aussi avoir quelque chose à voir avec cela: On dirait que vous avez oublié d'enregistrer le module http auprès de Windsor Castle avec IIS7

Était-ce utile?

La solution 4

C’est la solution qui a fonctionné pour moi:

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

Apparemment, NHibernate ou DynamicProxy utilisaient une sorte de magie sous Windows 2003 pour obtenir le symbole "==". opérateur à travailler avec l'opérateur surchargé.

Autres conseils

Vous n'avez pas expliqué ce que sont proposalCountries et proposalCountryServices . Il me semble que votre méthode Equals fonctionne très bien, mais dans IIS7, ils contiennent des objets distincts. Vous avez deux objets avec le même ID (donc Equals correspond) mais ils sont distincts, donc == ne correspond pas. .

Veuillez préciser le mode de chargement des deux collections - cela en sera probablement la cause.

la différence que je vois est dans le cas où vous avez écrit

c.Country == country.Country

et au cas deux il est

c.Country.Equals(country.Country))

donc je suppose que dans ce dernier cas, il réussit car il compare les identifiants de pays des deux objets dans le premier cas, mais il les compare eux-mêmes.

Pourquoi cela fonctionne sous IE6 Je ne sais pas ... désolé

Vous n'utilisez pas l'égalité référentielle (voir ci-dessous).

Object.Equals appellera une méthode Equals remplacée sur votre type.

Je suppose que vous avez extrait différentes instances d'entités de différents DataContexts et les avez ajoutées à une liste. Vous avez donc utilisé une valeur égale à Equals pour essayer de la faire fonctionner.

Mise à jour:

Désolé, vous n'êtes pas sûr d'utiliser LINQ2SQL.

Vous pouvez probablement résoudre le problème en remplaçant les opérateurs == /! =, mais vous devez également prendre en compte certaines considérations.

Mise à jour 2:

Pour comprendre ce que je veux dire, trouvez que les deux cas que vous jugez égaux (exactement où ce problème se produit). Définir un point d'arrêt. Maintenant, allez dans & obj1 et entrez et & obj2 dans, vous remarquerez qu'ils pointent vers des adresses d'objet différentes. Faites cela à la fois sur IIS 6 et 7.

Je ne suis pas sûr de savoir pourquoi cela se comporte différemment sur IIS6 et IIS7, mais je soupçonne que de légères différences dans le cycle de vie des pages pourraient être la raison pour laquelle elles ne sont pas égales par référence.

Mise à jour 3:

Utilisez-vous le mode classique dans IIS7? Sinon, essayez de le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top