Moja metoda OnTransactionCommit nie jest wywoływana w usługach IIS 7, gdy używam Response.Redirect lub Response.End. Poniższy kod działa zgodnie z oczekiwaniami w usługach IIS 6 („Postępowanie...” jest wyświetlane po „OK”), ale w usługach IIS 7 otrzymuję tylko „OK”, chyba że usunę Response.End. Metoda OnTransactionAbort jest wywoływana w obu wersjach IIS, jeśli zastąpię Response.End Err.Raise.

Próbowałem zmienić potok na klasyczny, ale to nie przyniosło efektu. Czy ktoś może rzucić jakieś światło na to, jakie ustawienie muszę zmienić, aby ta metoda została wykonana?

<%@ Transaction="Supported" Language="VBScript" %>
<% Option Explicit %>
<%
'Called by context unless transaction is aborted
Sub OnTransactionCommit()
    Response.Write("Commiting...")
    Response.Flush
End Sub

'Called by context when transaction is aborted
Sub OnTransactionAbort()
    Response.Write("Aborting...")
    Response.Flush
End Sub

Response.Write("OK<br/>")
Response.Flush
Response.End
'Err.Raise 1, "test"
%>
5
Andy Kershaw 27 lipiec 2011, 15:56
2
Upewnij się, że składnik MTS ("Microsoft Transaction Server") jest zainstalowany, uważam, że nie jest już domyślnie instalowany w systemie Windows Server 2008
 – 
ThatGuyInIT
27 lipiec 2011, 20:53
Jest poprawny, jednak może być zainstalowany, ale nie działa. Sprawdź panel sterowania usług. więcej szczegółów To powiedziawszy, z tego, co widziałem to wszystko jest częścią IIS 6, więc istnieje duża szansa, że ​​został „zrzucony” w IIS 7 i późniejszych.
 – 
Shadow Wizard Is Vaccinated V3
28 lipiec 2011, 11:14
MTS jest teraz częścią COM+. Jestem całkiem pewien, że jest zainstalowany i działa poprawnie. ObjectContext.SetAbort działa zgodnie z oczekiwaniami po usunięciu instrukcji Response.End, ale w IIS 6 działa nawet po zakończeniu odpowiedzi.
 – 
Andy Kershaw
28 lipiec 2011, 13:14
Prawdopodobnie będziesz musiał użyć RETURN lub EXIT SUB zamiast RESPONSE.END, aby uruchomić procedurę obsługi Commit. Stare zachowanie IIS6 nie jest poprawne, ponieważ Response.End to polecenie przerwania przetwarzania skryptu.
 – 
Louis Ricci
18 sierpień 2011, 23:31

2 odpowiedzi

Najlepsza odpowiedź

Wywołanie Response.End lub Response.Redirect prawdopodobnie wyrzuci ThreadAbortedException, tak jak wywołanie go w .NET (IIS7 i .NET są ściśle zintegrowane).

1
Erik A. Brandstadmoen 19 sierpień 2011, 00:47
Zgadzam się, że prawdopodobnie tak się dzieje, ale transakcja powinna zostać przerwana lub zatwierdzona, tak jak w IIS 6.
 – 
Andy Kershaw
20 sierpień 2011, 16:05
To stare rzeczy, ale powiedzenie „OK, skończyłem” lub „Gotowe, teraz przejdź do tej strony” nie powinno powodować błędów.
 – 
Leif Neland
11 kwiecień 2019, 04:04

Należy zauważyć, że wewnętrzne właściwości usług IIS są domyślnie wyłączone w systemie Windows 2008 i nowszych wersjach. Spójrz na ten link oraz tę stronę pomocy technicznej firmy Microsoft.

0
user1358065 26 kwiecień 2012, 12:05