
Είμαι με τη χρήση Context.RewritePath () σε ASP.NET 3.5 εφαρμογή που τρέχει στο IIS7.


Θα το κάνω σε εφαρμογή BeginRequest περίπτωση και πάντα αρχείο λειτουργεί.


Οι αιτήσεις για την / τον αθλητισμό ξαναγραφεί σωστά για να default.aspx? id = 1, και ούτω καθεξής.


Το πρόβλημα είναι ότι το ημερολόγιο των υπηρεσιών IIS μου βλέπω GET αιτήσεις για /Default.aspx?id=1 και όχι για / σπορ.


Αυτό το είδος του κώδικα λειτούργησε άψογα κάτω από IIS6.


Χρησιμοποιώντας ενότητα Επανεγγραφή Microsoft δεν αποτελεί επιλογή, λόγω κάποιας επιχειρηματικής λογικής που πρέπει να εφαρμοστεί.


Ευχαριστώ.


ΕΠΕΞΕΡΓΑΣΙΑ: 


Φαίνεται χειριστή μου είναι πολύ νωρίς στα σκαριά, αλλά αν μετακινήσετε τη λογική σε ένα μεταγενέστερο γεγονός, από το όλο θέμα ξαναγράψει δεν λειτουργεί (είναι πολύ αργά, StaticFileHandler παίρνει το αίτημά μου). 


Έψαξα στο Google και στο google, ρώτησε γύρω, δεν μπορώ να πιστέψω ότι κανείς δεν έχει αυτό το πρόβλημα;


ΕΠΕΞΕΡΓΑΣΙΑ:


Yikes! Εδώ είναι τι βρήκα στο φόρουμ IIS:


«Αυτό οφείλεται στο γεγονός ότι στην ολοκληρωμένη λειτουργία, IIS και το μερίδιο asp.net ένα κοινό αγωγό και το RewritePath θεωρείται πλέον από τις υπηρεσίες IIS, ενώ στην IIS6, δεν ήταν καν δει από τις υπηρεσίες IIS - μπορείτε να παρακάμψετε αυτό χρησιμοποιώντας κλασικό τρόπο λειτουργίας, που θα συμπεριφέρονται σαν IIS6.»


**Τελική ενημέρωση** : Παρακαλώ ρίξτε μια ματιά στην [απάντησή μου κάτω](https://stackoverflow.com/questions/353541/iis7-rewritepath-and-iis-log-files/579141#579141) , έχω ενημερωθεί με τα αποτελέσματα μετά από περισσότερο από ένα χρόνο σε περιβάλλον παραγωγής.

 
IIS7, RewritePath και IIS αρχεία καταγραφής
===========================================



Μετά από κάποια έρευνα, έχω βρεθεί επιτέλους μια λύση στο πρόβλημα.


Έχω αντικαταστήσει τις κλήσεις προς Context.RewritePath () μέθοδος με το νέο (εισήχθη το ASP.NET 3.5) **Context.Server.TransferRequest ()** μέθοδο.


Είναι προφανές πλέον, όχι όμως περίπτωση Ανώτερος Dev Μηχανικός στο IIS πυρήνα της ομάδας σκέψη ότι.


Έχω δοκιμάσει για συνεδρία, ταυτότητας, postback, querystring, ... θέματα και βρήκε κανένα.


Αύριο θα αναπτύξετε την αλλαγή σε μια πολύ hight ιστοσελίδα της κυκλοφορίας, και θα ξέρουμε σύντομα πώς λειτουργεί στην πραγματικότητα. :)


Θα είμαι πίσω με την ενημέρωση.


**Η ενημέρωση:** η λύση δεν είναι ακόμα απόλυτα σε διακομιστές παραγωγής μου, αλλά αυτό είναι δοκιμασμένο και κάνει δουλειά και στο βαθμό που μπορώ να πω τώρα, είναι μια λύση για το πρόβλημά μου. Αν έχω ανακαλύψει οτιδήποτε άλλο στην παραγωγή, θα δημοσιεύσετε μια ενημέρωση.


**Η τελευταία ενημέρωση:** Έχω αυτή τη λύση στην παραγωγή για πάνω από ένα χρόνο και έχει αποδειχθεί ότι είναι μια καλή και σταθερή λύση χωρίς προβλήματα.

 

Θα μπορούσατε να ορίσετε τη διαδρομή πίσω στην αρχική τιμή μετά την επεξεργασία της αίτησης, αλλά πριν από την μονάδα IIS υλοτομία γράφει η καταχώρηση στο αρχείο καταγραφής.


Για παράδειγμα, αυτή η ενότητα ξαναγράφει το δρόμο για `BeginRequest`και, στη συνέχεια, θέτει πίσω στην αρχική τιμή για `EndRequest`. Όταν χρησιμοποιείται αυτή η ενότητα η αρχική διαδρομή εμφανίζεται στο αρχείο IIS καταγραφής:



```
public class RewriteModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += OnBeginRequest;
        context.EndRequest += OnEndRequest;
    }

    static void OnBeginRequest(object sender, EventArgs e)
    {
        var app = (HttpApplication)sender;
        app.Context.Items["OriginalPath"] = app.Context.Request.Path;
        app.Context.RewritePath("Default.aspx?id=1");
    }

    static void OnEndRequest(object sender, EventArgs e)
    {
        var app = (HttpApplication)sender;
        var originalPath = app.Context.Items["OriginalPath"] as string;
        if (originalPath != null)
        {
            app.Context.RewritePath(originalPath);
        }
    }

    public void Dispose()
    {

    }
}

```
 

Είχα ακριβώς το ίδιο πρόβλημα. Ένας τρόπος γύρω από αυτό είναι να χρησιμοποιήσετε Server.Transfer αντί Context.RewritePath. Server.Transfer δεν κάνει επανεκκίνηση ολόκληρο τον κύκλο ζωής της σελίδας έτσι θα εξακολουθεί να καταγράφεται η αρχική διεύθυνση URL. Να είστε βέβαιος να περάσει «αλήθεια» για την παράμετρο «preserveForm» έτσι ώστε οι συλλογές QueryString και μορφή είναι διαθέσιμα στην 2η σελίδα.

 

Παλιά ερώτηση, αλλά βρήκα ότι δεν αντιμετώπισαν το πρόβλημα όταν έκανα το εξής:


α) Ένας κανόνας επανεγγραφής στο web.config να κατευθύνει όλες τις αιτήσεις για /default.aspx, π.χ.



```
    <rule name="all" patternSyntax="Wildcard" stopProcessing="true">
      <match url="*"/>
      <action type="Rewrite" url="/default.aspx"/>
    </rule>

```

β) Ονομάζεται RewritePath σε `Page_PreInit`περίπτωση default.aspx, να ξαναγράψουμε τη διεύθυνση URL και querystring όπως αυτό που ψηφίστηκε στην αίτηση (δηλ. η θέση που δεν υπάρχει).


Για παράδειγμα, Ι ζητήσει "/ somepage /; x = y" (η οποία δεν υπάρχει).


α) κανόνας Web.config που χαρτογραφεί να /default.aspx


β) Page\_PreInit αυτό ξαναγράφει πίσω στο "/ somepage /; x = y".


Το αποτέλεσμα αυτό, σε IIS 7 (Express και παραγωγής) είναι ότι ο καταγραφής του διακομιστή αντανακλά «/ somepage» για στέλεχος και «x = y» για το ερώτημα, και όλα τα ακίνητα Αίτηση αντικείμενο αντανακλά το ζητήσει (ανύπαρκτη) URL ( το οποίο είναι αυτό που ήθελα).


Το μόνο παράξενο φαινόμενο, το IIS Express, το στοιχείο καταγραφής είναι γραμμένο δύο φορές. Ωστόσο, αυτό δεν συμβαίνει στην παραγωγή (Windows Server 2008 R2).

 