【问题标题】:Windows Phone 7 Silverlight using sessionWindows Phone 7 Silverlight 使用会话
【发布时间】:2011-08-24 21:33:08
【问题描述】:

我正在创建一个 Windows 7 移动 Silverlight 项目。我使用 Rest api 使用类说 Authentication 进行身份验证。我得到一个身份验证令牌作为响应,并将其分配给类属性 AuthToken 因为我需要在不同的地方使用它。有什么方法可以将此 AuthToken 存储在会话或其他任何东西中。因为我在 wp7 中没有找到任何会话示例。谢谢

【问题讨论】:

    标签: c# silverlight session windows-phone-7 session-variables


    【解决方案1】:

    如果您想要临时会话存储(应用的生命周期,包括用户使用后退按钮返回您的应用的时间),那么您可以使用 Phone State。电话状态类似于 ASP.NET 中的会话状态。它只是一个带有字符串键的(可序列化)对象的字典,不会在您的应用程序启动时维护,但当您的应用程序从 Back Stack 导航到时,它会恢复。

    这是一个用于恢复名为 myObject 的自定义对象的示例:

    private CustomObject myObject;
    
    protected override void OnNavigatedFrom(NavigationEventArgs args)
    {
        //Save to State when leaving the page
        PhoneApplicationService.Current.State["myObject"] = myObject;
        base.OnNavigatedFrom(args);
    }
    
    protected override void OnNavigatedTo(NavigationEventArgs args)
    {
        if (PhoneApplicationService.Current.State.ContainsKey("myObject"))
        {
            //Restore from State
            myObject = (CustomObject)PhoneApplicationService.Current.State["myObject"];
        }
        else
        {
            //No previous object, so perform initialization
            myObject = new myObject();
        }
    }
    

    如果您需要在应用程序的所有实例中存储设置,请查看 IsolatedStorageSettings,它非常适合此操作。根据您的需要,还有其他选项 (Charles Petzold has a free eBook with some great examples)。


    不知道为什么上面的代码对你不起作用,但另一种选择是使用一个应用程序属性,该属性是使用 IsolatedStorageSettings 保存的。这是一个例子:

    在您的 App.xaml.cs 中:

        public bool VibrationOn { get; set; }
    
        private void Application_Launching(object sender, LaunchingEventArgs e)
        {
            LoadSettings();
        }
    
        private void Application_Activated(object sender, ActivatedEventArgs e)
        {
            LoadSettings();
        }
    
        private void Application_Deactivated(object sender, DeactivatedEventArgs e)
        {
            SaveSettings();
        }
    
        private void Application_Closing(object sender, ClosingEventArgs e)
        {
            SaveSettings();
        }
    
        private void LoadSettings()
        {
            IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
    
            bool vo;
            if (settings.TryGetValue<bool>("VibrationOn", out vo))
                VibrationOn = vo;
            else
                VibrationOn = true;
        }
    
        private void SaveSettings()
        {
            IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
            settings["VibrationOn"] = VibrationOn;
        }
    

    然后,您可以使用以下代码在应用程序的任何位置访问此属性:

        if (Application.Current.VibrationOn)
        {
            VibrateController.Default.Start(TimeSpan.FromMilliseconds(200));
        }
    

    【讨论】:

    • 我正在使用上面的代码。但是当我在任何其他类中获取此值时,它不会加载保存的值。它仅在我使用断点时有效
    • @Muhammad Zeeshan 不确定为什么页面状态不适合您。在我使用它的有限方式中,这对我来说很好。我已经用另一个示例更新了我的答案,您可能会发现它更适合您的情况。如果您需要该值过期,您还可以存储一个日期时间对象并在LoadSettings 方法中检查它。另一种选择是不在应用程序打开/关闭事件中调用LoadSettings/SaveSettings 方法,以便在重新启动应用程序时这些值恢复为默认值(但保留它们与返回状态)
    • 非常感谢您的回复。我使用了 schummbo 的回答。它适用于我的情况。我给你投了赞成票。 :)
    【解决方案2】:

    您没有找到任何会话示例,因为据我所知 WP7 没有会话。您应该能够使用独立存储来保留您的 AuthToken。但是请记住,它不会像您对会话所期望的那样在一定时间后过期。

    有关示例,请参见以下内容或谷歌搜索独立存储: http://www.windowsphonegeek.com/tips/all-about-wp7-isolated-storage-store-data-in-isolatedstoragesettings

    希望对您有所帮助。 WP7开发我没做过很多,但是对Silverlight比较熟悉。

    【讨论】:

    • 我正在使用上面的代码。但是当我在任何其他类中获取此值时,它不会加载保存的值
    【解决方案3】:

    假设您只希望在当前应用程序实例的生命周期内使用它:

    最简单的答案是将其存储为静态属性而不是实例属性。

    简单的答案是将其存储为应用程序类 (App.xaml.cs) 的属性。然后你可以在任何地方使用 ((App)(Application.Current)).Token

    不太简单但可能更好的答案是将其存储在 ViewModel 属性中,然后您可以通过 ViewModel 定位器访问该属性 - 以 MVVM Light 为例。

    在所有这些情况下,您都需要考虑墓碑,以便在用户点击开始然后返回(例如)时恢复它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-16
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多