2011-12-25 32 views
3

我想部署一個nopCommerce應用程序到AppHarbor。AppHarbor上的nopCommerce。重定向循環

當我開始頁面時,我遇到了一個運行時重定向循環。我平添了幾分調試日誌記錄和問題似乎是這部分中的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)在EnsureDatabaseIsInstalled方法改變從false boolean變量,以true應引起GetThisPageUrl方法來選擇不同的分支,生成URL,而不端口號。

2)更新GetThisPageUrl方法(「WebHelper.cs」)中的else分支以忽略端口號。

挑選第一個解決方案比較容易,但在其核心部分修補問題會更好,因此您不會遇到類似的問題。

+0

我通過正則表達式感謝您的建議移除的端口。解決了這個問題,但有大約十幾個人。我想我會放棄在AppHarbor上使用Nop的實驗 – chg 2011-12-26 10:34:06

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 \ Presentation \ Nop.Web \ Controllers \ 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... 
    }