2009-02-25 2 views
4

Ich habe folgende Beispiel Seitenstruktur:Wie erkennt man, ob eine aspx-Seite von Server.Execute aufgerufen wurde?

  • Webpage.aspx
  • Script.aspx

Wenn ich Server.Execute("Script.aspx") von Webpage.aspx nennen, wie kann ich in Script.aspx erkennen, dass es wurde von Webpage.aspx und nicht direkt von einem Webbrowser aufgerufen?

Ich habe versucht, den Referrer zu überprüfen, aber das scheint nur Domäne und nicht das Skript zurückzugeben.

Ich bin mit ASP.NET Web Forms auf .NET 3.5

Antwort

6

In Script.aspx.cs, können Sie einfach die Request.Path im Vergleich zu dem aktuellen Ausführungspfad überprüfen .

if (Request.CurrentExecutionFilePath == Request.Path) 
{ 
    //This has been called from a web browser 
} else { 
    //This has been executed from the file Request.Path 
} 

Warum?

Teile der Anfrage werden beim Aufruf von Server.Execute unverändert übergeben. Wenn Sie also den Wert von Request.Path von Ihrer Script.aspx.cs nach der Verwendung von Server.Execute in Ihrer Webseite.aspx.cs betrachten, sehen Sie, dass er den Wert "/Webpage.aspx" hat.

Wenn jedoch ein Webbrowser direkt auf Script.aspx zugreifen sollte, wird der Wert von Request.Path aus Script.aspx.cs in "/Script.aspx" resultieren. Der Befehl currentExecutionPath liefert immer das aktuell ausgeführte Skript, sodass ein Vergleich der beiden das gewünschte Ergebnis ergibt.

Hoffe, das hilft.

+0

Danke. Dies war die beste vorgeschlagene Methode, da ich außerhalb von script.aspx keine zusätzlichen Aufgaben erledigen musste. – GateKiller

0

Zumindest kann man sagen, ob die Anfrage durch Request.IsLocal lokal ist.

+0

Das gibt nur wahr zurück, wenn die Browseranforderung vom lokalen Server stammt. In meinem Fall gibt es immer falsch zurück. – GateKiller

+0

In diesem Fall glaube ich wirklich nicht, dass es Referenzen zur ursprünglichen Seite gibt. Ihre beste Wette ist wahrscheinlich, wie andere gesagt haben, diese Informationen in der Querystring – baretta

0

Sie könnten einen Querystring-Parameter an Script.aspx übergeben (wodurch Sie leichter erkennen können, dass es von WebPage.aspx aufgerufen wurde).

Server.Execute("script.aspx?xFrom=webPage.aspx")

EDIT: Ich denke, der Antrag einen Wert darin haben sollte für Sie zu wissen, dass es webpage.aspx läuft.

EDIT2: Anforderung.Url?

12

Da Server.Execute die neue Seite mit demselben Kontext wie die Originalseite ausführt, sollten alle Eigenschaften von Request immer noch die ursprüngliche Anforderung von Webpage.aspx widerspiegeln (außer CurrentExecutionFilePath, das hoffentlich "/Script.aspx" enthält)). Request.Path sollte "/Webpage.aspx" enthalten, während Request.Url das vollständige Uri-Objekt angibt, wenn Sie die Domäne oder die Abfragezeichenfolge sehen müssen.

Sie können auch Werte zu Context.Items hinzufügen, bevor Server.Execute aufrufen und lesen sie in Script.aspx

+0

+1 für die Verwendung von Context.Items zu übergeben - das ist, wofür es ist. – Sam

+0

+1 aus dem gleichen Grund wie Sam gab. mag ich! :-) –

0

HttpRequest.FilePath werden die URL der angeforderten Seite zurückkehren, die Sie dann einen Teil Spiel tun können auf für " Script.aspx ".

(Nehmen Sie diese Antwort mit einem riesigen Salzkorn aber meine .Net ziemlich schlecht ist.)

+0

Dies gibt "Script.aspx" zurück, aber ich möchte es "Webpage.aspx" zurückgeben. Danke für die Antwort. – GateKiller

+0

Warten Sie ... Versuchen Sie stattdessen die CGI 'SCRIPT_NAME' Variable. Ich habe keine ASP-Box, um dies jetzt zu testen, aber hoffentlich sollte es genauso funktionieren wie in PHP (was in diesem Fall das Richtige tut). – flussence

0

Angenommen, Sie haben keine IHttpHandler-Funnigkeit, können Sie überprüfen, ob HttpContext.PreviousHandler nicht null ist. Da es jedoch eine Million (gut, mehrere) Gründe dafür gibt, dass "PreviousHandler" gesetzt werden konnte, würde ich die Empfehlung von stevemegson verwenden, vor dem Aufruf von Server.Execute HttpContext.Items zu verwenden.