Applies To.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

Συμπτώματα

Μετά την εγκατάσταση του Ιουλίου 2018 ασφαλείας του .NET Framework και οι συλλογές ενημερωμένων εκδόσεων ποιότητας που ισχύουν για το .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 Πλαίσιο εφαρμογής που πληροί τα ακόλουθα κριτήρια:

  • Η εφαρμογή χρησιμοποιεί παρουσίες της κλάσης System.Transaction.TransactionScope στο οποίο είναι ενεργοποιημένη η ροή συναλλαγής μεταβιβάζοντας TransactionScopeAsyncFlowOption.Enabled στην κατασκευή.

  • Η εφαρμογή πραγματοποιεί μία ή περισσότερες απομακρυσμένες κλήσεις, ενώ ένα από αυτά τα πεδία συναλλαγή είναι ενεργή. Στην περίπτωση αυτή, μια απομακρυσμένη κλήση είναι οποιαδήποτε κλήση που μεταφέρονται μέσω ενός διακομιστή μεσολάβησης χωρίς παρεμβάσεις, πριν να φτάσουν το αντικείμενο διακομιστή. Παραδείγματα απομακρυσμένες κλήσεις περιλαμβάνουν κλήσεις σε άλλους τομείς εφαρμογής και οι κλήσεις που πραγματοποιούνται μέσω καναλιών απομακρυσμένης πρόσβασης, όπως τα κανάλια του υπολογιστή-πελάτη που έχουν οριστεί σε τα πεδία ονομάτων του System.Runtime.Remoting.Channels .

  • Μετά από την απομακρυσμένη κλήση, System.Transactions.Transaction.Current επιστρέφει μια τιμή null, αντί για την τιμή που επιστράφηκε πριν από την κλήση απομακρυσμένης.

Λύση

Για να επιλύσετε αυτό το ζήτημα, δοκιμάστε κάποια από τις ακόλουθες μεθόδους:

  • Για κάθε εύρος κίνησης που επιτρέπει ροή συναλλαγής, αλλάξτε την εφαρμογή για να βεβαιωθείτε ότι δεν υπάρχουν απομακρυσμένες κλήσεις συμβούν σε οποιοδήποτε σημείο στον κώδικα που εκτελείται ενώ είναι ενεργό το πεδίο της συναλλαγής. Όταν καθορίζετε αν περιέχει σε εμβέλεια συναλλαγής κλήσεις απομακρυσμένης, λάβετε υπόψη τις παρακάτω οδηγίες:

    • Μια κλήση σε μια στατική μέθοδο δεν είναι ποτέ μια απομακρυσμένη κλήση.

    • Για μια κλήση σε μια μέθοδο παρουσίας στο αντικείμενο προορισμού, η κλήση είναι απομακρυσμένη, μόνο εάν το αντικείμενο προορισμού είναι ένας διακομιστής μεσολάβησης χωρίς παρεμβάσεις.

    • Για μια κλήση σε μια κατασκευή, η κλήση είναι απομακρυσμένη, μόνο εάν το αντικείμενο που κατασκευάζονται είναι ένα διακομιστή μεσολάβησης χωρίς παρεμβάσεις.

    ΣημείωσηΠάντα, μπορείτε να χρησιμοποιήσετε τη μέθοδο System.Runtime.Remoting.RemotingServices.IsTransparentProxy για να ελέγξετε αν ένα αντικείμενο είναι ένα διακομιστή μεσολάβησης χωρίς παρεμβάσεις.

  • Απενεργοποιήστε τη ροή συναλλαγής, καταργώντας το όρισμα κατασκευής TransactionScopeAsyncFlowOption.Enabled

    Προειδοποίηση

    Αυτή η λύση είναι πιθανό να προκαλέσουν άλλα σφάλματα, εάν εκτελέσετε τις λειτουργίες "αναμένει" ενώ είναι ενεργό το πεδίο της συναλλαγής.

  • Η ιδιότητα Transaction.Current δεν είναι σειριοποιημένο αυτόματα στην απομακρυσμένη κλήση. Πρέπει να διαβιβαστούν ως παράμετρος. Εάν η απομακρυσμένη κλήση δεν επιτύχει τη συναλλαγή ως παράμετρο και δεν κάνει μια επιστροφή κλήσης στον υπολογιστή-πελάτη κατά την κλήση απομακρυσμένης, μπορείτε να δημιουργήσετε την απομακρυσμένη κλήση μέσα σε ένα νέο αντικείμενο TransactionScope που χρησιμοποιεί το TransactionScopeOptions.Suppress επιλογή. Μέσα σε αυτό, απόκρυψη εμβέλεια συναλλαγής, η ιδιότητα Transaction.Current έχει τιμή null.

Κατάσταση

Έχουμε είναι γνωρίζει αυτό το ζήτημα και εργάζεται σε μια ανάλυση.

Χρειάζεστε περισσότερη βοήθεια;

Θέλετε περισσότερες επιλογές;

Εξερευνήστε τα πλεονεκτήματα της συνδρομής, περιηγηθείτε σε εκπαιδευτικά σεμινάρια, μάθετε πώς μπορείτε να προστατεύσετε τη συσκευή σας και πολλά άλλα.