{"id":281,"date":"2011-01-30T11:58:54","date_gmt":"2011-01-30T11:58:54","guid":{"rendered":"https:\/\/blog.ecotronics.ch\/wordpress\/?p=281"},"modified":"2011-01-30T12:00:17","modified_gmt":"2011-01-30T12:00:17","slug":"redirect-und-session-variablen-in-asp-net","status":"publish","type":"post","link":"https:\/\/blog.ecotronics.ch\/wordpress\/?p=281","title":{"rendered":"Redirect und Session-Variablen in ASP.NET"},"content":{"rendered":"<p>In ASP.NET\u00a0 gibt es ein h\u00e4ssliches kleines Problem, man k\u00f6nnte es auch als Bug bezeichnen: Werden gleich<strong> zu Beginn einer Session Session-Variablen<\/strong> gesetzt und umittelbar danach ein <strong>Redirect <\/strong>aufgerufen, <strong>dann gehen die Session-Variablen verloren<\/strong>. Gem\u00e4ss diversen Artikeln l\u00e4sst sich dieses Problem umgehen, wenn man <strong>den zweiten Parameter von Redirect (endResponse) auf false setzt<\/strong>. Allerdings hat das in meinem Fall mit einer<strong> ASP.NET-Version 2.0.5 nicht funktioniert<\/strong>, und viele andere Beitr\u00e4ge berichten \u00e4hnliches. Das Problem besteht \u00fcbrigens nur beim allerersten Aufruf, wenn die Session noch nicht existiert, sobald einmal eine Session-ID als Cookie gespeichert ist, tritt das Ph\u00e4nomen nicht mehr auf.<\/p>\n<p>Meine Aufgabenstellung bestand darin, einen Request von einem externen Server je nach einer bestimmten Konstellation von Parametern an meine internen Seiten weiterzuleiten. Ich hatte dasselbe in ASP Dutzende von Malen gemacht und war bass erstaunt, als ich es in ASP.NET einfach nicht zum laufen bekam. Der Request kommt von einem fremden Server, so dass ich auf den Aufruf keinen Einfluss hatte und der Webserver ist nicht in meiner Verantwortung, so dass der Patch, der gelegentlich gegen diesen Bug empfohlen wird, keine Option war.<\/p>\n<p>Die einzige funktionierende L\u00f6sung f\u00fcr meinen Fall ist ein Trick: Da das Problem nur zu Beginn einer Session besteht, habe ich eine ASP.NET-Seite vorgeschaltet, die nichts anderes macht als die Session erzeugen (indem eine Session-Variable gesetzt wird) und dann auf die Seite mit der eigentlichen Verarbeitung weiterzuleiten. Der Trick besteht nun darin, dass <strong>der Redirect nicht in ASP.NET erfolgt, sondern in einem HTML-Metatag<\/strong>. Und dieses Metatag ist nat\u00fcrlich nicht statisch, denn dann k\u00f6nnte es ja die ankommenden Parameter nicht weitergeben, sondern es wird im ASP.NET Code erzeugt.<\/p>\n<p>Der HTML-Teil der Seite sieht folgendermassen aus:<\/p>\n<pre>&lt;%@ Page Language=\"C#\" AutoEventWireup=\"true\"\r\n  CodeFile=\"Start.aspx.cs\" Inherits=\"Start\" %&gt;<\/pre>\n<pre>&lt;!DOCTYPE html PUBLIC\r\n  \"-\/\/W3C\/\/DTD XHTML 1.0 Transitional\/\/EN\"\r\n  \"http:\/\/www.w3.org\/TR\/xhtml1\/DTD\/xhtml1-transitional.dtd\"&gt;<\/pre>\n<pre>&lt;html xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"&gt;\r\n\u00a0 &lt;head runat=\"server\"&gt;\r\n\u00a0\u00a0\u00a0 <strong>&lt;%= metatag %&gt;<\/strong>\r\n\u00a0 \u00a0\u00a0 &lt;title&gt;&lt;\/title&gt;\r\n\u00a0 &lt;\/head&gt;\r\n\u00a0 &lt;body&gt;\r\n\u00a0 &lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>Der einzig wichtige Teil davon ist &lt;%= metatag %&gt;. Im Code-Behind wird diese Variable dann mit dem konkreten Wert gef\u00fcllt:<\/p>\n<pre>public partial class Start : System.Web.UI.Page {\r\n\u00a0\u00a0 public String metatag = null;\r\n\u00a0\u00a0 protected void Page_Load(object sender, EventArgs e) {\r\n\u00a0\u00a0\u00a0\u00a0 <strong>Session[\"started\"] = \"y\";<\/strong>\r\n\u00a0\u00a0\u00a0\u00a0 <strong>metatag = \"&lt;meta HTTP-EQUIV=\\\"REFRESH\\\" \r\n       content=\\\"0; url=MyPage.aspx?\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 + Request.QueryString + \"\\\"&gt;\";<\/strong>\r\n\u00a0\u00a0 }\r\n}\r\n<\/pre>\n<p><strong>Als erstes setzt man eine Session-Variable<\/strong>. Name und zugewiesener Wert sind v\u00f6llig bedeutungslos, sie wird nur ben\u00f6tigt, damit die Session erzeugt wird. <strong>Die zweite Anweisung erzeugt ein HTML-Tag zur Weiterleitung<\/strong> und gibt diesem die mit <strong>Request.Querystring<\/strong> entgegengenommenen Parameter mit. Erst die aufgerufene Seite MyPage.aspx macht dann die vorgesehene Verarbeitung der Parameter und die eigentliche Weiterleitung aufgrund der Parameterkonstellation. Da auf dieser Seite nun bereits eine Session existiert, kann man Session-Variablen setzen und anschliessend ein ganz normales Response.Redirect machen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Workaround f\u00fcr das Problem in ASP.NET, dass Variablen, die zu Beginn einer neuen Session gesetzt wurden, verloren gehen, wenn unmittelbar darauf ein Redirect erfolgt. [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[63],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/281"}],"collection":[{"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=281"}],"version-history":[{"count":10,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/281\/revisions"}],"predecessor-version":[{"id":290,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/281\/revisions\/290"}],"wp:attachment":[{"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=281"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=281"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=281"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}