Произошли некоторые изменения в том, как вы пишете HttpModules в IIS7 по сравнению с IIS6 или 5, поэтому, возможно, мое предложение недопустимо, если вы используете IIS7.
Если вы используете текущее статическое свойство HttpContext, вы можете получить ссылку на текущий контекст. Класс HttpContext имеет свойства как для запроса (тип HttpRequest), так и для ответа (HttpResponse), и в зависимости от того, где какое событие вы обрабатываете (например, Application.EndRequest?), Вы можете выполнять различные действия над этими объектами.
Если вы хотите изменить содержимое доставляемой страницы, вы, вероятно, захотите сделать это как можно позже, поэтому, вероятно, лучшее место для этого - реагирование на событие EndRequest.
Проверка того, какой тип файла был запрошен, может быть выполнена путем проверки свойства Request.Url, возможно, вместе с классом System.IO.Path. Попробуйте что-то вроде этого:
string requestPath = HttpContext.Current.Request.Url.AbsolutePath;
string extension = System.IO.Path.GetExtension(requestPath);
bool isAspx = extension.Equals(".aspx");
Изменение содержимого сложнее. Вы можете сделать это в одном из событий объекта Context, но я не уверен.
Одним из возможных подходов может быть написание собственного класса, производного от пользовательской страницы, который будет проверять значение в коллекции Context.Items. Если это значение было найдено, вы можете добавить метку к объекту PlaceHolder и установить для текста метки любое значение.
Как-то так должно работать:
Добавьте следующий код в производный класс HttpModule:
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(BeginRequest);
}
void BeginRequest(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
HttpRequest request = context.Request;
string requestPath = HttpContext.Current.Request.Url.AbsolutePath;
string extension = System.IO.Path.GetExtension(requestPath);
bool isAspx = extension.Equals(".aspx");
if (isAspx)
{
// Add whatever you need of custom logic for adding the content here
context.Items["custom"] = "anything here";
}
}
Затем вы добавляете следующий класс в папку App_Code:
public class CustomPage : System.Web.UI.Page
{
public CustomPage()
{ }
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
if (Context.Items["custom"] == null)
{
return;
}
PlaceHolder placeHolder = this.FindControl("pp") as PlaceHolder;
if (placeHolder == null)
{
return;
}
Label addedContent = new Label();
addedContent.Text = Context.Items["custom"].ToString();
placeHolder .Controls.Add(addedContent);
}
}
Затем вы изменяете свои страницы следующим образом:
public partial class _Default : CustomPage
Обратите внимание, что наследование изменено с System.Web.UI.Page на CustomPage.
И, наконец, вы добавляете объекты PlaceHolder в ваши aspx-файлы, где бы вы ни хотели, чтобы ваш пользовательский контент.