שגיאות מתרחשות ביישומים המשלבים זרימת טרנזקציות ושיחות מרוחקות לאחר התקנת .NET Framework עדכוני אבטחה ואיכות של יולי 2018

חל על
.NET Framework 4.7.2 .NET Framework 4.7.1 .NET Framework 4.7 .NET Framework 4.6 .NET Framework 4.6.1 .NET Framework 4.6.2

סימפטומים

לאחר התקנת אוסף עדכוני האבטחה .NET Framework ביולי 2018 החלים על .NET Framework 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1 ו- 4.7.2 ב- Windows 7 Service Pack 1 (SP1), Windows Server 2008 R2 SP1 או Windows Server 2008 SP2, אתה מבחין בשגיאות .NET Framework אפליקציות שעומדות בקריטריונים הבאים:

  • היישום משתמש במופעים של המחלקה System.Transaction.TransactionScope שבה זרימת טרנזקציה זמינה על-ידי העברת TransactionScopeAsyncFlowOption.זמין לבנאי.
  • היישום מבצע קריאה מרוחקת אחת או יותר כאשר אחד מ טווחי הטרנזקציות הללו פעיל. במקרה זה, שיחה מרוחקת היא כל קריאה שנוהרת דרך Proxy שקוף לפני שהיא מגיעה לאובייקט השרת. דוגמאות לשיחות מרוחקות כוללות שיחות לתחום יישומים אחרים ושיחות המתבצעות באמצעות ערוצים מרוחקת, כגון ערוצי הלקוח המוגדרים במרווחי השמות System.Runtime.Remoting.Channels .
  • לאחר השיחות המרוחקות, System.Transactions.Transaction.Current מחזיר ערך Null במקום הערך שהוחזר לפני השיחות המרוחקות.

פתרון

כדי לעקוף בעיה זו, נסה אחת מהשיטות הבאות:

  • עבור כל טווח טרנזקציה המאפשר זרימת טרנזקציה, שנה את היישום כדי לוודא שלא מתרחשות קריאות מרוחקות בכל מקום בקוד המופעל כאשר טווח הטרנזקציה פעיל. כאשר אתה קובע אם טווח טרנזקציה מכיל שיחות מרוחקות, שקול את הקווים המנחים הבאים:

    • שיחה לשיטה סטטית לעולם אינה שיחה מרוחקת.
    • עבור קריאה לפעולת שירות של מופע באובייקט יעד, השיחה מרוחקת רק אם אובייקט היעד הוא Proxy שקוף.
    • עבור קריאה לבנאי, השיחה מרוחקת רק אם האובייקט שנבנה הוא Proxy שקוף.

    הערה תמיד תוכל להשתמש בפעולת השירות System.Runtime.Remoting.RemotingServices.IsTransparentProxy כדי לבדוק אם אובייקט הוא Proxy שקוף.

  • הפוך זרימת טרנזקציות ללא זמינה על-ידי הסרת הארגומנט TransactionScopeAsyncFlowOption.Enabled בנאי.

    אזהרה

    פתרון זה עשוי לגרום לשגיאות אחרות אם פעולות "ממתין" כלשהן יבובצעו כאשר טווח הטרנזקציה פעיל.

  • המאפיין Transaction.Current אינו עובר עריכה בסידרה באופן אוטומטי לשיחה המרוחקת. יש לבצע את ההעברה כפרמטר. אם ההתקשרות המרוחקת אינה מעבירה את הטרנזקציה ופרמטר ולא מבצעת התקשרות חזרה ללקוח במהלך השיחה המרוחקת, באפשרותך ליצור את השיחה המרוחקת בתוך אובייקט TransactionScope חדש המשתמש באפשרות TransactionScopeOptions.Suppress . בתוך טווח טרנזקציה זה של העלם, למאפיין Transaction.Current יש ערך Null.

מצב

אנו מודעים לבעיה זו ופועלים כעת למציאת פתרון.