Καλημέρα,
αφού ξόδεψα πάνω από 6 ώρες googling arround και αφού δοκίμασα όλα όσα ήξερα κα μπόρεσα να μάθω σε αυτό το χρονικό διάστημα, έχω αρχίσει να απελπίζομαι και αποφάσισα να μοιραστώ το πρόβλημά μου μαζί σας.
Το πρόβλημα:
Έχω ένα SharePoint (WSS) site. Όλα καλά.
Θέλω να "πιάνω" τα client errors του IIS και ειδικά το 404 (File not found). Δηλάδή όταν κάποιος χρήστης ζητήσει μια σελίδα που δεν υπάρχει, θέλω να παίρνει ένα custom 404 error page. Απλό ακούγεται... Αλλά δεν είναι... Έχω αρχίσει δε να φοβάμαι ότι μπορεί και να μην γίνεται...
Πιο συγκεκριμένα:
Οι λύσεις που δοκίμασα:
Στον Internet Information Services Manager πήγα στο site μου, right-clik, Properties, Custom Errors tab, και άλλαξα τα default settings για το 404, 404.2 και 404.3 errors σε URL που δείχνει μέσα στο site μου ("/404.aspx"). Ήμουνα βέβαιος ότι θα δούλευε.. Κι όμως... ούτε που συγκινήθηκε καθόλου ο server και μου έστελνε το ίδιο default error page.
Λέω μετά "ας πάω και στο web.config"... Πάω λοιπόν και στο customErrors section προσθέτω ένα <customErrors mode="On" ><error statusCode="404" redirect="~/404.aspx" /></customErrors > ως ήτο αναμενενόμενο. Λέω λοιπόν: "για να δούμε;".... Καμία συγκίνιση! Το ίδιο default 404 error page.
Με λίγη παρατηρητικότητα πρόσεξα ότι το default error page που έβλεπα έμοιαζε αλλά δεν ήταν ακριβώς το ίδο με το default error page του IIS6 μου (το οποίο βρίσκεται στο path C:\WINDOWS\help\iisHelp\common\). Αντιθέτως το error page που έπαιρνα (με λίγη ακόμα παρατηρητικότα) εντόπισα ότι ήταν στο res://C:WINNT\system32\shdoclc.dll/http_404.htm.... Οπότε λέω... "Αυτό είναι IE specific! Για να δούμε τι λέει και το Netscape;" Και το Netscape έλεγε: "404 NOT FOUND", και σε View/Page Source... ακριβώς το ίδιο (σκέτο text "404 NOT FOUND"). Μολίς το βλέπει αυτό ο IE σε πάει στο "friendly error message" του (το οποίο παρεπιτόντως είχα τσεκαρισμένο στο Tools/Internet Options/Advanced)...
Ποιός το βάζει λοιπόν αυτό το "404 NOT FOUND" εκεί; Στον IIS έχω πει να χρησιμοποιεί δικιά μου σελίδα για το 404. Στην ASP.NET μέσα στο web.config μου έχω κάνει το ίδιο... Οπότε λέω "oops! Κάτι άλλο μπαίνει στη μέση! Τι άλλο; Το πρώτο πράγμα που σκέφτηκα ήταν WSS ISAPI!"
Άρα το πρόβλημα, στη φάση αυτή, εντοπίστηκε στο πως θα παρακάμψω το WSS ISAPI ή πως θα το ξεγελάσω ή πως εν πάσει περιπτώσει θα το βάλω να κάνει αυτό που θέλω..
Για να το παρακάμψω ένας καλός τρόπος ήταν να γράψω εγώ ένα ISAPI filter που θα προσθέσω στο site και θα κάνω τη δουλειά μου πριν το πάρει χαμπάρι το WSS. Αυτό όμως δεν είναι η καλύτερη ιδέα και είπα να δω πρώτα αν μπορώ να πετύχω το στόχο μου με πιο απλό, γρήγορο και κομψό τρόπο...
Για να κάνω και ένα cross-check ότι δεν είμαι σε λάθος δρόμο, πήγα και στο SharePoint Central Administration και έριξα μια ματιά στο Define Managed Paths. Εκεί (αφού πρώτα έφτιαξα ένα physical (as opposed to WSS) folder στο website μου όχι με FP 2003 αλλά με File Explorer μέσα στο physical root folder), πρόσθεσα ένα exclusion για το /test. Δοκίμασα λοιπόν ένα request του τύπου http://myserver/test/lalala και oops! Δουλεύει! Με έστειλε στο 404 error page που είχα ορίσει στο Custom Errors tab του IIS Manager. Μόνο που αυτό δουλεύει εφόσον το error page είναι σε unmanaged path. Αντίθετα το http://myserver/lalalala (που δεν υπάρχει) μου στέλενει πάραυτα το γνωστό "404 NOT FOUND" που προανέφερα...
Το πρόβλημα φυσικά παραμένει οπότε συνεχίζονται και οι προσπάθειες...
Λέω λοιπόν να πάω στο root του WSS site μου και να προσθέσω ένα global.asax (που δεν υπάρχει by default), να κάνω τη δουλειά μου...
Βάζω λοιπόν το global.asax (χωρίς codebehind φυσικά) και γράφω:
<%@ Application language="C#" %>
<script runat="server">
virtual protected void Application_BeginRequest(Object sender, EventArgs e)
{
Response.Write("begin request caught");
}
virtual protected void Application_EndRequest(Object sender, EventArgs e)
{
Response.Write("end request caught");
}
</script>
Και φυσικά βλέπω στην αρχή και το τέλος κάθε σελίδας τα δύο μηνυματάκια που έβαλα στο global.asax οπότε λέω "we are in business"...
To τροποποιώ λοιπόν (το global.asax) ως εξής:
<%@ Application language="C#" %>
<script runat="server">
virtual protected void Application_EndRequest(Object sender, EventArgs e)
{
if (Response.StatusCode == 404)
{
Response.Clear();
// δεν μπορώ να κάνω Response.Redirect εδω, ούτε Server.Transfer, οπότε...
Response.Write(String.Format("<html><head><script>self.location='/404.aspx';<{0}script></head><body></body></html>", "/"));
}
}
</script>
Και τρέχω να δοκιμάσω! Ω! Ναι! δουλεύει! ΑΛΛΑ.... μόνο για .ASPX requests... Δηλαδή το http://myserver/aPageThatDoesNotExist.ASPX κάνει τελικά redirect στο error page μου όπως ήθελα και όπως τα είχα κανονίσει στο global.asax!
ΑΛΛΑ... αν ζητήσεις http://myserver/aPageThatDoesNotExist.HTM .... ως αναμενόμενο... δεν πιάνει καθώς για τα htm δεν τρέχει το global.asax μια και δεν χειρίζεται αυτό τα requests...
Τι κάνουμε λοιπόν;;;; Εμένα το πρόβλημά μου βρίσκεται στα .htm κυρίως!
Προς το παρόν ακόμα ψάχνομαι...
Καμιά καλή ιδέα κανείς;;;;;;
rousso
rousso