Подтвердить что ты не робот

Может ли .NET перехватывать и изменять файлы css?

ОБНОВЛЕНИЕ 1:

Теперь у меня установлена ​​IIS6, поэтому .NET может обрабатывать вызовы в .css файлы. Что мне теперь нужно сделать, чтобы заставить его изменять файлы css на основе реферала? Поэтому, если URL реферала http://intranet/, он должен продолжить вызов старых таблиц стилей. Если референтный URL http://intranetv2/, он должен вызывать новую таблицу стилей.


ОРИГИНАЛЬНЫЙ ВОПРОС:

Фон:

У меня есть 2 поисковых системы. 1 старая, а другая - совершенно новая (этап разработки). Поисковая система 1 находится на domain1.com, а поисковая система 2 находится на домене2.com. Оба домена находятся на одном сервере. И поиск веб-страниц на домен1.com основан на том, что пользователь вводит в поисковые системы. Разница между двумя поисковыми системами заключается в том, что новый быстрее, дает более точные результаты и имеет чрезвычайно улучшенный пользовательский интерфейс. Обе поисковые системы останутся в живых, чтобы пользователи могли привыкнуть к новому в свое время, а не просто бросать их в глубокий конец и вообще удалять старую поисковую систему.

В любом случае, достаточно фона, в основном, поскольку поисковые страницы находятся на старом доменном имени со старой поисковой системой, тогда как новая поисковая система находится на новом доменном имени,...

Вопрос:

... Могу ли я использовать HttpModule или другую часть .NET или что-то из IIS6 даже для захвата ссылок на страницы, сгенерированных новой поисковой системой, и динамически изменять файл css, прикрепленный к старым страницам поиска на старом домен?

Причина:

По сути, это выглядит как совершенно новый сайт, где, если поисковая система старого домена используется для доступа к страницам старого домена, используется старая таблица стилей, но если поисковая система в новом домене используется для доступа к файлам с возможностью поиска по старому доменному имени, новая таблица стилей должна использоваться, чтобы старые страницы выглядели новыми. Поскольку существует много страниц с возможностью поиска в области 10 000, редактирование каждой страницы для добавления оператора if для проверки имени реферала до добавления таблицы стилей на страницы не является реалистичным вариантом.

Среда:

Старая поисковая система, а также страницы поиска на старом домене используют .net 1.что-то, но новая поисковая система нового доменного имени использует .net 3.5, и я использую vb.net для asp.net страниц. Сервер является сервером IIS6.

4b9b3361

Ответ 1

  • В IIS, установите HttpHandler для получения всех типов файлов, которые вы хотите (говорит, что вы это сделали)
  • пользователь Server.MapPath() на HttpRequest.Url.AbsolutePath, чтобы получить физический путь
  • Изменить путь в соответствии с доменом
  • Запишите файл в поток ответов.

Вот обработчик (упрощенный), который я обычно использую для альтернативных файлов сервера для разных доменов:

using System;
using System.IO;
using System.Web;
public class MultiDomainFileHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        string filePath = GetDomainSpecificFilePath(context.Request.Url.Host,
            context.Server.MapPath(context.Request.Url.AbsolutePath));

        if (File.Exists(filePath))
        {
            switch (Path.GetExtension(filePath).ToLower())
            {
                case ".css": context.Response.ContentType = "text/css"; break;
                case ".jpg":
                case ".jpeg": context.Response.ContentType = "image/jpeg"; break;
                //other types you want to handle
                default: context.Request.ContentType = "application/octet-stream"; break;
            }
            context.Response.WriteFile(filePath); //Write the file to response
        }
        else context.Response.StatusCode = 404;
    }

    private string GetDomainSpecificFilePath(string domain, string originalPath)
    {
        string prefix = "";
        switch (domain.ToLower())
        {
            case "intranetv2": prefix = FILE_PREFIX_INTRANETV2; break;
            case "www.example.com": prefix = FILE_PREFIX_EXAMPLE_DOT_COM; break;
            //other domains you want to handle
        }
        string dir = Path.GetDirectoryName(originalPath);
        string fileName = prefix + Path.GetFileName(originalPath);
        return Path.Combine(dir, fileName);
    }

    const string FILE_PREFIX_INTRANETV2 = "v2.", FILE_PREFIX_EXAMPLE_DOT_COM = "ex.com.";
    public bool IsReusable { get { return false; } }
}

Теперь вам просто нужно иметь альтернативные файлы в тех же каталогах. Например:

/Images/logo.jpg

/Images/v2.logo.jpg

/Styles/mystyle.css

/Styles/v2.mystyle.css

Надеюсь, это поможет:)

Ответ 2

Да, вы должны иметь возможность использовать HttpModule в своем "старом" приложении для перехвата вызовов на старый CSS. На основе версии IIS, которую вы имеете на своем сервере, вам может потребоваться выполнить некоторую настройку, чтобы убедиться, что .NET обрабатывает вызовы в .css файлы, иначе ваш HttpModule не будет вызван. См. этот вопрос для справки.

Как только .NET обрабатывает вызовы CSS, вы можете динамически переключать css динамически, если запрос предназначен для "старого" css файла.

Вот старая статья (так как вы на .NET 1.1), которая должна указывать вам в правильном направлении для реализации и конфигурации IIS: "URL переписывания в ASP.NET" . В основном то, что вы делаете, очень похоже, поскольку вы "переписываете" определенный URL-адрес (тот, который находится в вашем старом файле CSS), чтобы указать на другой контент.

Ответ 3

Я делаю что-то похожее для файлов, обслуживаемых нашей системой управления контентом. Если обработчик http включен, он проверяет имя файла и путь, чтобы узнать, имеет ли пользователь доступ к ресурсу. Если пользователь делает это, он передает файл, в противном случае он возвращает 401 не авторизованных.

Я не понимаю, почему вы не могли использовать обработчик для перехода в конвейер для файла css, проверки имени хоста и потока другого css файла вместо (если применимо). Это просто в IIS7 с интегрированным конвейером (вы не указали), но также возможно в IIS6, если вы разрешаете расширение css обрабатываться через .net.

Сообщите мне, если вы заинтересованы в этом подходе, и я выберу код.

Изменить - здесь код

Это не совсем то, что вы ищете, но вы можете получить некоторые идеи.

ПРИМЕЧАНИЕ. Это в IIS7 со встроенным конвейером, поэтому в IIS6 вам придется внести изменения, чтобы файлы .css обрабатывались процессом .net.

Public Class FileManagerFileAuthorization
    Implements IHttpHandler

    Public ReadOnly Property IsReusable As Boolean Implements System.Web.IHttpHandler.IsReusable
        Get
            Return True
        End Get
    End Property

    Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements System.Web.IHttpHandler.ProcessRequest

        Dim req As HttpRequest = context.Request
        Dim absolutePath As String = req.Path
        Dim fileName As String = Path.GetFileName(absolutePath)
        Dim physicalPathAndFileName As String = HttpContext.Current.Server.MapPath(absolutePath)

        If File.Exists(physicalPathAndFileName) Then

            ' roles that the user is part of. If the user is not authenticated they are part of the public role only
            Dim memberRoles As String()
            If req.IsAuthenticated = False Then
                memberRoles = New String() {ConfigurationManager.AppSettings("PublicRole")}
            Else
                Dim r As New Roles()
                memberRoles = r.GetRolesForUser("")
            End If

            ' check permissions: transmit file or deliver 401
            Dim folderVirtualPath As String = Path.GetDirectoryName(absolutePath).Replace("\"c, "/"c)
            Dim permissions As FileManager.FolderPermissions = FileManager.GetFolderPermissions(folderVirtualPath, memberRoles)
            If permissions And FileManager.FolderPermissions.View Then
                context.Response.ContentType = FileManager.GetContentType(fileName)
                context.Response.AddHeader("Content-Length", New FileInfo(physicalPathAndFileName).Length.ToString())
                context.Response.TransmitFile(physicalPathAndFileName)
            Else
                ' unauthorized
                context.Response.StatusCode = 401
            End If

        Else
            ' file not found
            context.Response.StatusCode = 404
        End If

        context.Response.End()

    End Sub

End Class

И web.config - и снова - это IIS7, поэтому вы будете использовать раздел <httpHandlers/> в разделе system.web. Я ищу любой файл внутри каталога Userfiles, но я думаю, что вы можете указать на файл с этим.

<system.webServer>
  <handlers>
    <add name="FileManagerFileAuthorization" path="Userfiles*" verb="GET" type="FileManagerFileAuthorization" resourceType="Unspecified" preCondition="integratedMode" />
  </handlers>
</system.webServer>

Примечание:

Чтобы разрешить .net обрабатывать файлы un.net в IIS, вы должны разрешить процессу .net обрабатывать обработку этих файлов. Для этого откройте диспетчер IIS, перейдите на сайт и нажмите свойства. Перейдите на вкладку "домашний каталог" и нажмите "Конфигурация". Добавьте сопоставление подстановочных знаков и выберите DLL.net. Если вы не уверены, скопируйте ссылку из .ascx ниже.

Поскольку это IIS6, вы не сможете использовать раздел system.webServer выше, вам нужно будет добавить http-обработчики по-старому. Эта ссылка объясняет это: http://msdn.microsoft.com/en-us/library/46c5ddfy.aspx

Ответ 4

На основе имени домена вы можете динамически управлять частью страницы из кода, стоящего за файлами (.vb или .cs или даже классом). Это даст вам возможность заменить файл css на основе имени domian. Захватите имя домена в коде, а затем замените файл/ссылку css, проинформируйте всю часть кода. вы можете сделать это на С# или в VB.

Ответ 5

Я бы не рекомендовал использовать httpModule, поскольку он будет вызван для каждого запроса, который может ухудшить производительность. Принимая во внимание, что вы можете использовать httpHandlers для обработки только определенных путей. Поэтому мой голос будет состоять в использовании httpHandlers.

Но есть сбой. По умолчанию IIS 6 не передает запросы для расширения без ASP.Net(по умолчанию читайте расширения ASP.NET, asashx,.ashx,.axd и все такое).

Поэтому вам нужно добавить модуль ISAPI для расширения CSS, чтобы передать запрос aspnet_isapi.dll(вы можете найти полный путь от обработчика расширений .aspx).

Эта ссылка может помочь в настройке модуля ISAPI.

Как только ASP.Net начнет обработку расширения .CSS, напишите httpHandler с вашей логикой и добавьте следующую строку в разделе httpHandlers в web.config файле

Скажите, что ваш httpHandler CSSHttpHandler, тогда код будет примерно таким.

<add verb="HEAD,GET" path="*.css" type="CSSHttpHandler">

Надеюсь, что это поможет.

Ответ 6

Возможно, вы можете добавить HTTP-модуль в старый домен и проверить, является ли request.UrlReferrer страницей результатов поиска из нового домена, а затем заменяет ссылки на старый стиль в генерируемом выпуске.

Ответ 7

Как я заявил в своем комментарии re: один из ответов, я думаю, что заголовок http_referer укажет на страницу контента, которая связывает/импортирует запрошенный файл css, а не страницу результатов поиска, связанная с страницей содержимого. Таким образом, даже если результаты поиска находятся на http://intranetv2, Request.ServerVariables [ "HTTP_REFERER '] во время запроса файла css будет http://intranet, и вы продолжите получение старого файла css.

Похоже, вам нужно выяснить способ либо обслуживать 10000 страниц контента из нового http://intranetv2 домена, или придумать способ установить флаг во время запроса страницы aspx содержимого (возможно, в global.asax Application_BeginRequest), который можно прочитать и действовать во время запроса файла css (например, HttpHandler, как и другие).

Не уверен, какой будет соответствующий механизм сигнализации. Он должен работать для каждого пользователя, а не для каждого приложения, а также быть доступным во время и сохраняться во множестве разрозненных запросов к файлам, а выбор ограничен с помощью .NET 1.1.