nopCommerce на AppHarbor. Цикл перенаправления - PullRequest
3 голосов
/ 25 декабря 2011

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

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

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 25 декабря 2011

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

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

2) Обновление ветви else в методе GetThisPageUrl ("WebHelper.cs") для игнорирования номера порта.

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

2 голосов
/ 08 апреля 2012

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

Во-первых, исправление @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...
    }
    
...