Несколько вкладок браузера с различными сессиями mvc - PullRequest
0 голосов
/ 19 апреля 2020

Этот проект позволяет клиентам страховать различные виды предметов риска (инвалидная коляска / транспортное средство / скутер). Для каждого элемента риска был создан отдельный маршрут (поскольку для каждого типа задаются разные вопросы). В настоящее время можно выбрать элемент риска, и клиент затем заполняет всю свою информацию, получает предложение и затем вводит политику (оплата с помощью кредитной / дебетовой карты). Это приложение было создано, чтобы застраховать только один элемент риска для каждой политики. Все это прекрасно работает, если клиент хочет застраховать только один элемент риска. Если клиент затем выбирает страховать другой (или другой) элемент риска, проблема сохраняется, поскольку браузер теперь сохраняет сеанс предыдущего запроса.

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

Вот что было сделано ...

Регистрация маршрутов (файл, на который ссылается Global.asax)

    public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapMvcAttributeRoutes();
        routes.MapRoute(
            name: "Scooter",
            url: "Scooter/{action}/{id}",                
            defaults: new { controller = "Mobility", action = "All", id = UrlParameter.Optional}
        );
        routes.MapRoute(
            name: "Wheelchair",
            url: "Wheelchair/{action}/{id}",
            defaults: new { controller = "Mobility", action = "All", id = UrlParameter.Optional }
        );
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "ComingSoon", id = UrlParameter.Optional }
        );

    }
}

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        BundleMobileConfig.RegisterBundles(BundleTable.Bundles);

        //Add a required data annotation that relies on the value of another property to set the field as required
        DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredIfAttribute),typeof(RequiredAttributeAdapter));
    }

Создание сеансов:

    #region Helpers
    private static T GetSession<T>(string key)
    {
        object value = HttpContext.Current.Session[key];

        if (value == null)
            return default(T);
        else
            return ((T)value);
    }

    private static void SetSession(string key, object value)
    {
        HttpContext.Current.Session[key] = value;
    }

    public static void ClearQuoteSession()
    {
        HttpContext.Current.Session.Clear();
        HttpContext.Current.Session.Abandon();
    }

    public static string GenerateBuyMapCode()
    {
        var holderKey = Guid.NewGuid();

        var polMapCode = "BB-" + holderKey;

        return polMapCode.Trim();
    }

Следующий метод позволяет создавать сеансы с помощью cook ie.

    public static PolicyBase CreateNewPolicyBase(Enums.RiskType type)
    {
        var polBase = new PolicyBase();
        polBase.Insured = new InsuredViewModel();
        polBase.RiskMeItems = new List<RiskItemMeModel>();
        *Irrelevant code removed*
        polBase.SessionKey = GenerateBuyMapCode();
        polBase.BrowserSession = HttpContext.Current.Session;

        *Irrelevant code removed*
        return polBase;
    }

    #region Session INIT
    public static string QuoteKey
    {
        get { return GetSession<string>("QuoteKey"); }
        set { SetSession("QuoteKey", value); }
    }
    public static AusEnums.RiskType RiskType
    {
        get { return GetSession<AusEnums.RiskType>("RiskType"); }
        set { SetSession("RiskType", value); }
    }

    public static AusEnums.QuoteArea Area
    {
        get { return GetSession<AusEnums.QuoteArea>("QuoteArea"); }
        set { SetSession("QuoteArea", value); }
    }

    public static PolicyBase PolicyBase
    {
        get { return GetSession<PolicyBase>("PolicyBase"); }
        set { SetSession("PolicyBase", value); }
    }

    public static SSMultiPremium MultiPremium
    {
        get { return GetSession<SSMultiPremium>("MultiPremium"); }
        set { SetSession("MultiPremium", value); }
    }

Web.config

    <sessionState mode="InProc" cookieless="UseDeviceProfile" regenerateExpiredSessionId="true" timeout="20" />

Элементы риска мобильности и моторного риска имеют различный старт баллы, следующее является отправной точкой мобильности (клиент следует принципу)

    [HttpGet]
    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")]
    public ActionResult Insured()
    {
        //We need to determine the direction

        SessionHelper.GetRoutePath((Route)ControllerContext.RouteData.Route);
        var polBase = SessionHelper.PolicyBase;
        HttpCookie userCookie = new HttpCookie("BBCookieCheck");
        userCookie["Name"] = "BB";
        userCookie.Expires.AddDays(1); // cookie will expire after 1 days
        Response.Cookies.Add(userCookie);

        var viewModel = new InsuredViewModel();
        if (polBase != null)
        {
            viewModel = polBase.Insured;
            viewModel.Title = polBase.Insured.Title;
        }

        viewModel.riskType = SessionHelper.RiskType;
       *Irrelevant code removed*
        return View(viewModel);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Insured(InsuredViewModel model)
    {
        *Irrelevant code removed*
        //create a new quote object and save the relevant fields
        var polBase = SessionHelper.PolicyBase;
        if (model.Id == 0)
        {
            polBase = SessionHelper.CreateNewPolicyBase(model.riskType);
           *Irrelevant code removed*
        }
     }

1 Ответ

1 голос
/ 22 апреля 2020

Похоже, что ваш вариант использования может выиграть от сеанса без файлов cookie состояния отслеживания. Похоже, вы в значительной степени там.

    <sessionState cookieless="UseUri" regenerateExpiredSessionId="true" timeout="20" />

UseDeviceProfile в значительной степени означает, что любой современный браузер прибегнет к использованию файлов cookie. Но если вы специально заблокируете его на UseUri, вы можете получить лучшие результаты.

В этом случае ваш GetSession<string>("XXX"), вероятно, станет избыточным, поскольку каждый сеанс будет относиться только к одному потоку политики

...