Использование Custom HttpHandler для перенаправления пользователей в Sharepoint - PullRequest
2 голосов
/ 08 апреля 2010

Мне нужно перенаправить пользователя на другую страницу, если он посещает определенный набор страниц в сети. Есть одно условие: мне не разрешается трогать IIS. Я погуглил и нашел что-то под названием пользовательский HttpHandler для WSS 3.0. Это звучало как что-то, что я могу использовать для захвата URL-адреса, который вводит пользователь (самый злонамеренный способ попасть на страницу, которая действительно должна быть перенаправлена) и перенаправить их на другую страницу / сеть. Но не имея возможности использовать его, мне было интересно, нахожусь ли я на правильном пути, используя Custom HttpHandler для перенаправления пользователя на другую страницу в Sharepoint с помощью C #?

Большое спасибо.

Ответы [ 3 ]

3 голосов
/ 08 апреля 2010

HttpHandler s используются IIS для «обработки» документов различных типов, например, у вас есть отдельный обработчик .asmx, обработчик .aspx, обработчик .ascx и т. Д.

Просмотр SPUtility.Redirect

Вы можете использовать метод SPUtility.Redirect, когда хотите перенаправить пользователя на другую страницу.Например, вы можете создать целевую страницу, которая определяет членство пользователя в роли, и на основе этой информации вы можете перенаправить их на соответствующую страницу.Или, основываясь на содержимом строки запроса, выданной браузером пользователя, вы можете перенаправить их на страницу, которая может обработать строку запроса, например на страницу результатов Центра поиска.

В качестве альтернативы вы можетеможно посмотреть Использование одноразовых объектов Windows SharePoint Services .

- РЕДАКТИРОВАТЬ -

Это ответ на ваш комментарий;вы думаете в правильном направлении

  1. Создайте собственный HttpHandler; Пример 1 , Пример 2
  2. Всякий раз, когда пользователь запрашивает URL, ваш пользовательский HttpHandler будет обрабатывать его.
  3. Redirect(), если выкак и URL, в противном случае.

Но для того, чтобы ваш Custom HttpHandler работал, он должен сначала вызываться - поэтому в вашем конфигурационном файле вы должны будете указать значение в path.Обычно здесь добавляется расширение.Но вы можете заменить это на *, чтобы работать для всех запросов.Я верю, что это сработает.

<httpHandlers>
    <add verb="*" path="*.aspx" type="MyNameSpace.MyHttpHandler, MyAssemblyName" />
</httpHandlers>

- РЕДАКТИРОВАТЬ -

Это ответ на ваш комментарий.Предполагая, что у вас есть «доступ» к страницам, чтобы вы могли писать на нем javascript, вы можете использовать javascript следующим образом.

<script language=JavaScript>
function RedirectIfUnAuthorized()
{
    //Get the location of the current page.
    var currentUrl = new String( document.location.href ) 

    //See if it belongs to the urls you are looking for; redirect if so.
    if (currentUrl == "http://www.thisUrl.com/page1.aspx") {Response.Redirect("http://www.GOOGLE.com")}
    if (currentUrl == "http://www.thisUrl.com/page2.aspx") {Response.Redirect("http://www.BING.com")}
    if (currentUrl == "http://www.thisUrl.com/page3.aspx") {Response.Redirect("http://www.someother.com")}
}
</script>

Вы можете вызвать вышеуказанный javascript в событии OnLoad страницы.

1 голос
/ 08 апреля 2010

Вам разрешено развертывать код на сервере? Или это тоже касается IIS?

(SharePoint также вносит изменения в web.config. Если вам разрешено развертывать код, вы тоже можете. Если вы не скажете своим администраторам, они, вероятно, даже не заметят.)

Вы можете «развернуть» ваши изменения web.config с помощью SPWebConfigModification и таким образом развернуть любые перенаправления web.config или httphandlers.

0 голосов
/ 12 апреля 2010

Обработчики HTTP являются конечной точкой объекты в конвейере ASP.NET и HTTP-обработчик по сути обрабатывает запрос и выдает ответ. За Пример страницы ASP.NET является HTTP Handler.

Модули HTTP - это объекты, которые также участвовать в трубопроводе, но они работают до и после того, как обработчик HTTP свою работу, и производить дополнительные услуги внутри трубопровода (для пример ассоциированного сеанса внутри запрос до выполнения обработчика HTTP, и сохранение состояния сеанса после HTTP-обработчик сделал свою работу, в основном делается с помощью модуля HTTP, SessionStateModule)

В вашем случае HTTPModule потребует перенаправить другую веб-страницу.

using System;
using System.Web;
using System.Web.UI;
using System.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data;

namespace CustomHttpModule
{
    public class HttpModuleImplementation : IHttpModule
    {
        #region IHttpModule Members

        public void Dispose()
        {

        }

        public void Init(HttpApplication context)
        {
            if (context == null)
                throw new ArgumentNullException("Context == null");

            context.AuthorizeRequest += new EventHandler(this.ProcessRequestHandler);
        }
        #endregion

        private void DummpRequest(object sender, EventArgs e)
        {
        }
        //first check that user.identity record exist in database
        //If not then forward user to User registration page
        private void ProcessRequestHandler(object sender, EventArgs e)
        {
            try
            {
                HttpApplication context = (HttpApplication)sender;
                string strAbsoluteUri = context.Request.Url.AbsoluteUri.ToLower();
                                //check if request is accessing aspx page
                if (strAbsoluteUri.Substring(strAbsoluteUri.Length - 5, 5).Contains(".aspx"))
                {
                    string userName = context.User.Identity.Name;
                    //replace Test Module with DB call to validate user data
                    if (!CheckUserInDb(userName))
                    {
                        if (!strAbsoluteUri.Contains("mypage.aspx"))
                            redirectToRegistrationPage(context);
                    }
                }
            }
            catch (Exception ex)
            {
            }
        }
        private void redirectToRegistrationPage(HttpApplication context)
        {
            context.Response.Redirect("http://" + context.Request.ServerVariables["HTTP_HOST"].ToString() + "Regpage.aspx", false);
        }

        private bool CheckUserInDb(string userName)
        {
                    return true;
        }
    }
}

В файле web.config виртуального каталога SharePoint необходимо ввести следующую запись в разделе httpModules:

<add name="CustomHttpModule" type="CustomHttpModule.HttpModuleImplementation, CustomHttpModule" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...