2011-12-25 4 views
3

Я пытаюсь развернуть приложение nopCommerce в AppHarbor.nopCommerce на AppHarbor. Redirect loop

Однако, когда я запускаю страницу, я запускаю цикл перенаправления во время выполнения. Я добавил немного отладки лесозаготовок и проблема, как представляется, эта часть в Global.asax.cs -> EnsureDatabaseIsInstalled():

if (!webHelper.GetThisPageUrl(false).StartsWith(installUrl, StringComparison.InvariantCultureIgnoreCase)) 
      { 
       this.Response.Redirect(installUrl); 
      } 

сравнение StartsWith всегда ложно, потому что GetThisPageUrl возвращает http://[name].apphb.com:14275/install

и installUrl (через GetStoreLocation) возвращает http://[name].apphb.com/install

Кто-нибудь мог сделать nopCommerce с AppHarbor вообще?

ответ

6

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

1) Изменение логического аргумента от false к true в методе EnsureDatabaseIsInstalled должен вызвать метод GetThisPageUrl, чтобы выбрать другую ветвь, которая генерирует URL без номер порта.

2) Обновление ветки else в методе GetThisPageUrl (из «WebHelper.cs»), чтобы игнорировать номер порта.

Лучше всего выбрать первое решение, но исправление проблемы в ее основе будет лучше, поэтому вы не столкнетесь с подобными проблемами.

+0

Я удалил порт с помощью регулярных выражений спасибо за предложение. Исправляет эту проблему, но есть около десятка других. Я думаю, что я собираюсь прервать эксперимент с Nop на AppHarbor – chg

2

В дополнение к исправлению @TroelsThomsen мы используем обертку в нашем базовом контроллере, чтобы гарантировать, что весь наш код не обращает внимания на изменение порт афарбора.

Во-первых, @TroelsThomsen исправить в Webhelper.cs: 75

public virtual string GetThisPageUrl(bool includeQueryString, bool useSsl) 
     { 
      string url = string.Empty; 
      if (_httpContext == null) 
       return url; 

      if (includeQueryString) 
      { 
       string storeHost = GetStoreHost(useSsl); 
       if (storeHost.EndsWith("/")) 
        storeHost = storeHost.Substring(0, storeHost.Length - 1); 
       url = storeHost + _httpContext.Request.RawUrl; 
      } 
      else 
      { 
#if DEBUG 
       var uri = _httpContext.Request.Url; 

#else 
       //Since appharbor changes port number due to multiple servers, we need to ensure port = 80 as in AppHarborRequesWrapper.cs 
       var uri = new UriBuilder 
       { 
        Scheme = _httpContext.Request.Url.Scheme, 
        Host = _httpContext.Request.Url.Host, 
        Port = 80, 
        Path = _httpContext.Request.Url.AbsolutePath, 
        Fragment = _httpContext.Request.Url.Fragment, 
        Query = _httpContext.Request.Url.Query.Replace("?", "") 
       }.Uri; 
#endif 
       url = uri.GetLeftPart(UriPartial.Path); 
      } 
      url = url.ToLowerInvariant(); 
      return url; 
     } 

Так что мы сделали просто добавить файлы из https://gist.github.com/1158264 в Nop.Core \ AppHarbor

и модифицированные базовые контроллеры:

  • nopcommerce \ Презентация \ Nop.Web \ Контроллеры \ BaseNopController.cs

    public class BaseNopController : Controller 
    { 
        protected override void Initialize(RequestContext requestContext) 
        { 
         //Source: https://gist.github.com/1158264 
         base.Initialize(new RequestContext(new AppHarborHttpContextWrapper(System.Web.HttpContext.Current), 
                  requestContext.RouteData)); 
        } 
        //Same file from here downwards... 
    } 
    
  • nopcommerce \ Презентация \ Nop.Web.Admin \ Контроллеры \ BaseNopController.cs

    public class BaseNopController : Controller 
    { 
    protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
        //set work context to admin mode 
        EngineContext.Current.Resolve<IWorkContext>().IsAdmin = true; 
    
        //Source: https://gist.github.com/1158264 
        base.Initialize(new RequestContext(new AppHarborHttpContextWrapper(System.Web.HttpContext.Current), requestContext.RouteData)); 
    
        //base.Initialize(requestContext); 
    } 
        //Same file from here downwards... 
    }