لماذا أواجه مشكلة غريبة في مقارنة مثيلات الكائنات على IIS 7؟

StackOverflow https://stackoverflow.com/questions/611433

سؤال

لدي مشكلة غريبة حقًا ولا يمكنني اكتشافها من خلال مقارنة الكائنات على IIS 7.نحن بصدد نشر تطبيق ASP.NET القديم المستند إلى IIS 6 على 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();
    }
}

لدي الكود التالي في صفحة ASPX على IIS 6 و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)) %>
<% } %>

وهنا نتائجي:

إيس 6:

100 <-- CountryID
100 <-- CountryID Hash Code
100 <-- Country Hash Code

1 <-- Something Found
1 <-- Something Found
1 <-- Something Found

إيس 7:

100 <-- CountryID
100 <-- CountryID Hash Code
100 <-- Country Hash Code

0 <-- Nothing Found
1 <-- Something Found
1 <-- Something Found

هل هناك فرق بين .NET 3.5 SP1 على نظام التشغيل Windows 2003 مقابل نظام التشغيل Windows 2008؟أنا حقًا في حيرة من المشكلة.هل واجه أي شخص مشكلة مماثلة؟

التحديث 1:

للإجابة على سؤال جون.يتم تحميل المجموعتين باستخدام NHibernate.لكنني أشعر أنني يجب أن أكرر أن كلا من IIS 6 وIIS 7 يستخدمان نفس البناء بالضبط من التطبيق، لذلك ما لم يغير NHibernate أو DynamicProxy2 كيفية تحميل الأشياء استنادًا إلى Windows 2003 أو Windows 2007، والذي لم أتمكن من العثور على أي شيء عنه على Google، فلا أعرف ما الذي يمكنني فعله به.

هذه أيضًا مشكلة على مستوى النظام عندما أقوم بمقارنة اثنين من كائنات الكيان الخاصة بي.لذلك يمكن أن يكون لها علاقة ببرنامج DynamicProxy2، ولكن كلا الكائنين عبارة عن كائنات بلد وبالنظر إلى التجاوزات التي قمت بإنشائها، يجب أن يعمل كل شيء بنفس الطريقة في 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:

ربما كان لهذا أيضًا علاقة به:يبدو أنك نسيت تسجيل وحدة http في Windsor Castle مع IIS7

هل كانت مفيدة؟

المحلول 4

هذا هو الحل الذي نجح بالنسبة لي:

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

من الواضح أن NHibernate أو DynamicProxy كانا يقومان بنوع من السحر في نظام التشغيل Windows 2003 لجعل عامل التشغيل "==" يعمل دون تحميل المشغل بشكل زائد.

نصائح أخرى

أنت لم توضح ماذا proposalCountries و proposalCountryServices نكون.يبدو لي أن طريقة Equals الخاصة بك تعمل بشكل جيد، ولكن في IIS7 تحتوي على كائنات مميزة - لديك كائنين لهما نفس المعرف (لذلك يتطابق Equals) لكنهما كائنان مختلفان، لذا == لا يتطابق .

يرجى تقديم تفاصيل حول كيفية تحميل المجموعتين - فمن المحتمل أن يكون هذا هو السبب.

الفرق الذي أراه هو في حالة ما كتبته

c.Country == country.Country

وفي الحالة الثانية فهو كذلك

c.Country.Equals(country.Country))

لذلك أعتقد أنه نجح في الحالة الأخيرة لأنه يقارن معرفات البلد لكلا الكائنين في الحالة الأولى ولكنه يقارن الكائنات نفسها.

لماذا يعمل هذا تحت IE6 لا أعرف ...آسف

أنت لا تستخدم المساواة المرجعية (انظر أدناه).

سوف يقوم Object.Equals باستدعاء أسلوب Equals الذي تم تجاوزه على النوع الخاص بك.

أظن أنك قمت بسحب مثيلات مختلفة للكيانات من DataContexts مختلفة، وإضافتها إلى القائمة، وبالتالي استخدام يساوي الذي تم تجاوزه لمحاولة إنجاحه.

تحديث:

عذرًا، لست متأكدًا إذا كنت تستخدم LINQ2SQL.

ربما يمكنك حل المشكلة عن طريق تجاوز عوامل التشغيل ==/!=، ولكن هناك بعض الاعتبارات التي يجب مراعاتها بشأن ذلك أيضًا.

التحديث 2:

لفهم ما أعنيه، ابحث عن الحالتين اللتين تعتبرهما متساويتين (بالضبط حيث تحدث هذه المشكلة).تعيين نقطة توقف.الآن، اذهب إلى &obj1 وأدخل و&obj2 وأدخل، ستلاحظ أنها تشير إلى عناوين كائنات مختلفة.قم بذلك على كل من IIS 6 و 7.

لست متأكدًا من سبب تصرفها بشكل مختلف على IIS6 وIIS7، لكنني أظن أن الاختلافات الدقيقة في دورة حياة الصفحة قد تكون السبب وراء عدم تساويهما مرجعيًا.

التحديث 3:

هل تعمل ضمن الوضع الكلاسيكي في IIS7؟إذا لم يكن الأمر كذلك، حاول القيام بذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top