MVC4 -> Сопоставление одного пути с другим (не контроллером)

Хорошо, позвольте мне спросить это по-другому. У нас есть веб-приложение. У нас есть платные и пробные подписки. У каждого из них в настоящее время есть папка, названная в честь их идентификатора пользователя, и именно там живет их код. Код получает свой идентификатор пользователя из URL-адреса, поэтому мы не можем изменить URL-адрес. Я хочу объединить расположение нашего кода, чтобы люди переходили по тому же URL-адресу, что и сегодня (имя сайта/имя пользователя), но он возвращал код приложения (который представляет собой структуру папок) из одного места. Я пробовал все, что мог придумать, но Server.Transfer не может передать в папку, передача в index.html не работает, Server.TransferLocation и (конечно) Response.Redirect меняют URL-адрес на стороне клиента .

Я пытался сделать это в RouteHandler, и в контроллере это не имеет значения, я не могу найти способ прозрачно перенаправить пользователя в центральную кодовую базу. В идеале я бы сделал это в коде, чтобы я мог проверить, что это за пользователь, и перенаправить его соответствующим образом.

После многих итераций вот основной код прямо сейчас:

public class FarmHttpHandler : IRouteHandler
{
    enum UserType { Invalid = -1, Standard = 1, Tester = 2, Developer = 3}

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        // Note - this has to be a valid URL, or it will loop forever, as our HTTP handler is at the base level.
        // We need to add a 'bad request' page, or it could default to the demo ( this would be a support nightmare though, if someone mistyped their URL,
        // they would think it was fine, at first.
        string redirect = "/Home/Error";

        var routeValues = requestContext.RouteData.Values;

        if (routeValues.ContainsKey("farmName"))
        {
            string farmName = routeValues["farmName"].ToString();


            string baseUrl = "/";// HttpContext.Current.Request.Url.AbsoluteUri.Replace(HttpContext.Current.Request.Url.AbsolutePath, "/");

            switch(GetUserType(farmName))
            {
                case UserType.Invalid:
                    break;
                case UserType.Developer:
                    redirect = baseUrl + Settings.BetaAppPath;
                    break;
                case UserType.Standard:
                    redirect = baseUrl + Settings.FullAppPath;
                    break;
                case UserType.Tester:
                    redirect = baseUrl + Settings.TesterAppPath;
                    break;
            }
        }

        HttpContext.Current.Server.TransferRequest(redirect);

        requestContext.HttpContext.RewritePath(redirect);


        return requestContext.HttpContext.Handler;
    }

Это вызывается, но путь перезаписи ничего не делает (ошибка говорит, что IHttpHandler не был возвращен), и TransferRequest работает, но URL-адрес изменяется в браузере. Код также использует относительные пути для изображений и т. д., и они не загружаются (не уверен, что смогу это исправить).


person cgraus    schedule 07.12.2013    source источник
comment
Возможно, вы говорите о перезаписи URL-адреса... Очень небольшая выборка очень поможет (10-15 строк: входящий URL-адрес + какой контроллер/необработанный файл вы хотите вернуть + (возможно) таблица маршрутизации)   -  person Alexei Levenkov    schedule 07.12.2013
comment
Возможно, я. Я разместил код в прошлый раз, когда спросил, и это, казалось, создало путаницу и дало мне ответы, которые не касались моего вопроса. Позвольте мне добавить код...   -  person cgraus    schedule 07.12.2013
comment
@cgraus, где хранится farmName?   -  person LostInComputer    schedule 07.12.2013
comment
Это значение, которое появилось в контексте. На самом деле это URL. А затем он сохраняется в базе данных SQL, вот как я его проверяю. Это не проблема, все отлично работает. Немного, что я не могу сделать, это перенаправить запрос без изменения URL-адреса на стороне клиента.   -  person cgraus    schedule 07.12.2013


Ответы (1)


Ответ

         return BuildManager.CreateInstanceFromVirtualPath(URl, typeof(Page)) as Page; 

Вот как вы возвращаете перенаправление из обработчика маршрута. К сожалению, у меня это не сработает, браузер не может перенаправить запросы в нашем веб-приложении и не отправляет запросы на полный URL-адрес, что означает, что я не могу обнаружить их, чтобы переназначить.

person cgraus    schedule 07.12.2013