Buchungsformulare zu einem 404 + Httphandler in IIS7: warum alle POST-Daten verschwunden sind?

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

  •  01-07-2019
  •  | 
  •  

Frage

OK, könnte dies ein wenig verwirrend und kompliziert klingen, so mit mir tragen.

Wir haben einen Rahmen geschrieben, die uns freundliche URLs zu definieren. Wenn Sie auf eine beliebige URL surfen, versucht IIS einen 404-Fehler angezeigt werden (oder, in einigen Fällen, 403; 14 oder 405). Allerdings ist IIS so einrichten, dass irgendetwas auf diese spezifischen Fehler gerichtet ist, zu einer ASPX-Datei gesendet. Dies ermöglicht uns eine Httphandler zu implementieren, um die Anfrage und tun Dinge zu behandeln, die eine zugehörige Vorlage zu finden, das beinhaltet, und dann die Ausführung, was damit verbunden ist.

Nun, dies alles funktioniert in IIS 5 und 6 und in einem Ausmaß, auf IIS7 - aber für einen Haken, das passiert, wenn Sie ein Formular veröffentlichen

.

Sehen Sie, wenn Sie ein Formular auf eine nicht vorhandene URL zu veröffentlichen, sagt IIS „ah, aber das URL existiert nicht“ und wirft einen 405 „Verfahren nicht erlaubt“ Fehler. Da wir IIS doch sagen, diese Fehler zu unserer ASPX-Seite umgeleitet werden und daher ist es mit unserer Httphandler Handhabung, ist dies normalerweise kein Problem. Aber wie von IIS7, alle POST Daten werden nach dem verschollen zum 405. umgeleitet Und so können Sie nicht mehr tun, um die banalsten Dinge beteiligt Formen.

Um dies zu lösen, die wir versucht haben, eine Httpmodule verwenden, die POST-Daten bewahrt aber erscheinen nicht zur richtigen Zeit eine initialisierten Session haben (wenn es gebraucht wird). Wir haben auch versucht ein Httpmodule für alle Anforderungen verwendet wird, nicht nur die fehlenden Anforderungen, die 404/403 getroffen; 14/405, aber das bedeutet Sachen wie Bilder, CSS, JS usw. von .NET-Code behandelt werden, die schrecklich ineffizient ist <. / p>

Was mich auf die eigentliche Frage bringt: hat jemand jemals begegnet, und hat jemand einen Rat oder weiß, was die Dinge zu tun, um wieder zu arbeiten? mit Microsofts eigene URL Rewriting Modul rel="nofollow . Würde dies unser Problem lösen?

Danke.

War es hilfreich?

Lösung

Microsoft einen Hotfix für diese Freigabe:

http://support.microsoft.com/default.aspx/kb/956578

Andere Tipps

Da IIS7 .net von oben verwendet da unten würde jede Performance-Overhead nicht ein Httpmodule zu verwenden, in der Tat gibt es mehrere Managed Httpmodules, die auf jede Anfrage immer verwendet werden. Wenn das Beginrequest Ereignis ausgelöst wird, hat die Session kann nicht auf die Module Sammlung hinzugefügt worden ist, so dass, wenn Sie versuchen, die Anfrage während dieser Veranstaltung Informationen zur Verfügung stehen werden keine Sitzungszustand zu behandeln. die HttpContext.Handler Eigenschaft Einstellung wird der Sitzungszustand initialisieren, wenn die angeforderte Handler es braucht, so dass Sie nur den Handler auf Ihre Phantasie 404-Seite, die IRequiresSessionState implementiert einstellen. Der folgende Code sollte es tun, wenn Sie eine andere Implementierung für den IsMissing () -Methode schreiben müssen:

using System.Web;
using System.Web.UI;

class Smart404Module : IHttpModule
{
    public void Dispose() {}

    public void Init(HttpApplication context)
    {
        context.BeginRequest += new System.EventHandler(DoMapping);
    }

    void DoMapping(object sender, System.EventArgs e)
    {
        HttpApplication app = (HttpApplication)sender;

        if (IsMissing(app.Context))
            app.Context.Handler = PageParser.GetCompiledPageInstance(
                "~/404.aspx", app.Request.MapPath("~/404.aspx"), app.Context);
    }

    bool IsMissing(HttpContext context)
    {
        string path = context.Request.MapPath(context.Request.Url.AbsolutePath);

        if (System.IO.File.Exists(path) || (System.IO.Directory.Exists(path)
            && System.IO.File.Exists(System.IO.Path.Combine(path, "default.aspx"))))
            return true;
        return false;
    }
}

Edit: Ich habe eine Implementierung von IsMissing ()

Hinweis: Bei IIS7, die Sitzungsstatusmodul läuft nicht global standardmäßig. Es gibt zwei Möglichkeiten: Aktivieren Sie den Sitzungsstatusmodul für alle Anforderungen (siehe meinen Kommentar oben in Bezug auf Lauf verwaltete Module für alle Anforderungstypen), oder Sie können Reflektion verwenden, um interne Mitglieder innerhalb System.Web.dll Zugriff

.

Das Problem in IIS 7 von POST-Variablen nicht durch benutzerdefinierte Fehlerhandler übergeben wird in Service Pack 2 für Vista behoben. Haben Sie nicht auf Windows Server versucht, aber ich bin sicher, dass es auch dort fixiert werden.

Nur eine Vermutung: der Handler in IIS7 des% windir angegeben% \ system32 \ inetsrv \ config \ applicationhost.config, die Ihre Anfrage ist der Umgang mit nicht Postverb wird ermöglicht überhaupt durchkommen, und es ist diese Regel der Bewertung vor der Entscheidung, ob die URL existiert nicht.

Ja, ich würde auf jeden Fall empfehlen URL-Rewriting (unter Verwendung von Microsoft IIS7 einen oder eine der vielen Alternativen). Dies ist speziell für freundliche URLs bereitstellt, während Fehlerdokumente sind ein letzter verzweifelter Gegenhalter für Ausfälle, die die eingehenden Daten munge neigt, so dass es nicht sein kann, was man erwartet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top