0
回答
WebBrowser(WebView) API (浏览器控件WebView)
滴滴云服务器,限时包月0.9元,为开发者而生>>>   

一、WP8中的WebBrowser

Windows Phone 提供基于桌面浏览器的 WebBrowser 控件。Windows Phone OS 7.1 的 WebBrowser 控件基于 Internet Explorer 9,且 Windows Phone 8 的 WebBrowser 控件基于 Internet Explorer 10。因此,与在 Windows Phone 8 上运行的手机相比,使用在 Windows Phone 7.5 运行的 WebBrowser 的控件的应用,其外观稍有不同。

WebBrowser 控件可以嵌入应用中并且使用它的原因很多,不仅限于以下原因:

● 显示网络中的 Web 内容。您可以构建一个应用,该应用只是由指向您网站的嵌入 WebBrowser 控件组成,在该控件外面有自定义标记。有关更多信息,请参见如何使用Windows Phone的WebBrowser控件显示网络中的 Web 内容

● 显示静态的 Web 内容。可以将应用配置为在本地独立存储中保存的内容,然后在嵌入的 WebBrowser 控件中查看这些内容。有关更多信息,请参见如何使用 Windows Phone 的 WebBrowser 控件显示静态 Web 内容

● 显示动态生成的 Web 内容。可以将 WebBrowser 控件指向应用代码中动态构造的 HTML 内容。有关更多信息,请参见如何使用Windows Phone的WebBrowser控件显示动态生成的 Web 内容

默认情况下,脚本在 WebBrowser 控件中处于禁用状态。如果您想在控件中启用脚本,请将 IsScriptEnabled 属性设置为 true。可使用 InvokeScript 方法调用脚本。当 WebBrowser 控件中的 JavaScript 将字符串传递到托管的代码时,将发生 ScriptNotify 事件。

警告:当您在 XAML 中创建 WebBrowser 控件时,您必须为该控件的 System.Windows.FrameworkElement.Name 属性指定值,以便 Windows Phone 功能检测工具能够合理地检测和赋予应用正确的功能。有关 Windows Phone 功能检测工具的详细信息,请参见如何确定应用功能

二、Windows8中的WebView

Windows8 中的WebView提供承载应用程序内 HTML 内容的 UI 元素。WebView 始终使用文档模式中 Internet Explorer 10。与WP8的WebBrowser类似,WebView可以显示网络中的 Web 内容、静态的 Web 内容以及动态生成的 Web 内容。具体使用方法我们稍后进行介绍。

需要注意的是,WebView 目前不支持某些 HTML5 功能,包括 AppCache、IndexedDB、对剪贴板的编程访问或地理位置。此外,WebView 不支持 ms-appdata: scheme,但是其支持 ms-appx-web: scheme

三、Android的WebView

如果你想实现一个Web应用(或仅仅是一个网页)作为你应用中的一部分,你可以使用WebView来实现它。WebView是Android的View类的扩展,它允许你显示一个网页作为Activity布局的一部分。它不包含成熟的浏览器的一些功能,例如导航控制或输入栏。默认情况下,WebView显示一个网页。

一个使用WebView的很普遍的场合是当你想要在应用中提供需要时常更新的信息时,例如用户协议或用户手册。在Android应用当中,你能创建一个Activity它包含一个WebView,然后使用它你可以显示网上提供的文档。

另一个使用WebView的场合是:假如你的应用总是需要网络链接来获取数据并提供给用户,例如电子邮件。这时候,你能发现在应用中创建一个WebView并使用网页来显示用户数据,比执行网络请求,解析数据然后再渲染到Android布局当中更加方便。你只需要根据Android设备设计网页,然后在应用当中实现一个WebView然后载入刚刚设计的网页。

四、最佳做法

WP8:

开发使用 WebBrowser 控件的应用程序时,考虑以下有关安全的最佳做法和信息:

● 从独立存储加载的内容或使用 NavigateToString(String) 方法动态加载的内容的处理方式不同于从网络加载的内容。从独立存储加载的内容或使用 NavigateToString 动态加载的内容没有跨站点限制,但从网络加载的内容有跨站点限制。因此,在从独立存储加载或使用 NavigateToString 动态加载不受信任的内容时应格外小心。

● 请注意传递给 InvokeScript(String) 方法的数据的敏感性。例如,隐私或位置数据不应该向不受信任的脚本代码公开。

● 不应该使用 WebBrowser 控件创建常规用途的浏览器应用程序,因为此 API 并未设计为支持此类应用程序所需的全部安全功能。

● WebBrowser 控件不提供查看 URL 或安全锁定图标的功能。

● 在 WebBrowser 控件中,用户不能从 https 页面导航到 http 页面。这不同于设备浏览器,在设备浏览器中用户可以从 https 页面导航到 http 页面。

● 应用程序不能与 Internet Explorer Mobile 共享 Cookie。

● 除非在应用程序中将 IsScriptEnabled 属性设置为 true,否则默认情况下在浏览器中禁用脚本。

Win8:

● WebView 不是Control子类且没有控件模板。显示区域为Width和Height。

● WebView 具有其他 UI 区域特征,如控件无法呈现在 WebView 顶部。这问题的原因是如何处理窗口区域内部,尤其是输入事件是如何处理以及屏幕是如何绘制的。如果您要呈现 HTML 内容并且还要将其他用户界面元素放置在该 HTML 内容的顶部,则应使用WebViewBrush作为呈现区域。WebView 仍提供 HTML 源信息,您可通过元素名称绑定和 SourceName 属性引用该 WebView。WebViewBrush 没有此复盖限制。

● 如果要显示一个偶尔有交互的WebView(例如下拉列表或应用程序栏),可以在必要时临时隐藏 WebView 控件,将其替换为一个使用WebViewBrush填充的元素。然后,当重叠的内容不存在时,可以再次显示原始 WebView。

WebView 不支持许多像KeyDownKeyUpPointerPressed的UIElement事件。此问题的常见解决方法是将WebView.InvokeScript与 eval 一起使用以便使用 HTML 事件处理程序,以及使用WebView.ScriptNotify以便使用 HTML 事件处理程序的 window.external.notify 来通知应用程序。

五、应用WebBrowser (WebView)

WP8和Win8应用

1.  显示网络中的 Web 内容

可以通过将 WebBrowser (WebView)控件托管在应用程序中并使用其 Source 属性或 Navigate(Uri) 方法更改该控件的位置来实现该操作。

警告: 默认情况下,脚本在 WebBrowser 控件中处于禁用状态。如果您想在控件中启用脚本,请将 IsScriptEnabled 属性设置为 true。

以下代码示例显示如何从 .xaml 文件内部更新 WebBrowser (WebView)控件的 Source 属性:

Wp8:

<phone:WebBrowser Source="http://www.bing.com" />

Win8:

<WebView Source=" http://www.bing.com "/>

或者,如果在 .xaml 文件中为 WebBrowser (WebView)控件指定了一个名称,则可以从该代码隐藏文件内部更新 Source 属性。以下代码示例显示如何更新 WebBrowser 控件(在 .xaml 文件中已命名为 webBrowser1(webView1))的 Source 属性:

Wp8:

webBrowser1.Source = new Uri("http://www.bing.com", UriKind.Absolute);

Win8:

webView1.Source = new Uri("http://www.bing.com", UriKind.Absolute);

或者,也可以使用 WebBrowser(WebView)类的 Navigate(Uri) 方法来实现该目标:

Wp8:

webBrowser1.Navigate(new Uri("http://www.bing.com", UriKind.Absolute));

Win8:

webView.Navigate(new Uri("http://www.bing.com", UriKind.Absolute));

如果您选择调用方法而不是设置属性,那么请记住,如果WebBrowser控件尚不在可视化树中,则会引发 InvalidOperationException。为了避免这个问题,您可以向 Loaded 事件附加一个处理程序,以确保在调用该方法之前此控件位于可视化树中。

Wp8:

webBrowser1.Loaded += (object sender, RoutedEventArgs e) =>
{
    webBrowser1.Navigate(new Uri("http://www.bing.com", UriKind.Absolute));
};

Win8:

webView1.Loaded += (object sender, RoutedEventArgs e) =>
{
    webView1.Navigate(new Uri("http://www.bing.com", UriKind.Absolute));
};

2.  显示静态 Web 内容

您可以使用 WebBrowser (WebView)控件在应用程序中显示已设置格式的静态内容。例如,开发人员可能希望在应用程序包中包含帮助文本,以便用户可以随时访问。或者,您也可以使用 WebBrowser (WebView)控件显示应用程序已使用 SaveToString() 方法保存到独立存储的静态 Web 内容。

向项目中添加静态内容

向项目中添加静态内容的步骤

1. 使用以下 HTML 代码创建一个名为 readme.htm 的 HTML 文件:

 <head><title>Sample Readme File</title></head>
   <body>
      <p>Sample Readme Content</p>
   </body>
</html>

2. 在 Visual Studio 中打开一个新的或现有的解决方案。

3. 在“解决方案资源管理器”中,右键单击您项目的名称,单击“添加”,然后单击“现有项”。

4. 导航到 readme.htm 文件的位置,选择该文件,然后单击“添加”。

5. 在“解决方案资源浏览器”中,单击该文件的名称。确认“属性”窗口中的“生成操作”部分。

添加命名空间

在页面后台代码中添加以下资源以包含以下命名空间。例如,如果您对主页使用默认命名约定,则应更新 MainPage.xaml.cs。

using System.IO.IsolatedStorage;
using System.IO;
using System.Windows.Resources;

添加 WebBrowser(WebView)控件

可以使用工具添加 WebBrowser (WebView)控件,也可以手动添加 WebBrowser (WebView)控件。

使用工具添加 WebBrowser(WebView)控件

使用工具添加 WebBrowser (WebView)控件的步骤

1. 在 Visual Studio 中打开一个新的或现有的解决方案。

2. 查看项目的 XAML 文件时,单击“工具箱”,将 WebBrowser (WebView)控件拖动到设备的图像中。

手动添加 WebBrowser(WebView)控件

在 XAML 中创建 WebBrowser (WebView)控件的步骤

1. 打开将在其中添加 WebBrowser (WebView)控件的页面的 XAML 文件。在“解决方案资源浏览器”中,右键单击该页面的 .xaml 文件(默认情况下,新应用程序的主页名为“MainPage.xaml”),然后选择“打开”。

2. 在 ContentGrid 中添加一个 WebBrowser (WebView)控件。例如:

Wp8:

<phone:WebBrowser HorizontalAlignment="Left" Margin="20,50,0,0" Name="webBrowser1" VerticalAlignment="Top" Height="500" Width="430" />
</Grid>

Win8:

<Grid x:Name="ContentGrid" Grid.Row="1">
    <WebView HorizontalAlignment="Left" Margin="20,50,0,0" Name="webView1" VerticalAlignment="Top" Height="500" Width="430" />
</Grid>

添加向独立存储中添加文件的代码

修改页面后台代码以包含以下两个函数,这两个函数将帮助向独立存储中添加静态文件。例如,如果您对主页使用默认命名约定,则应更新 MainPage.xaml.cs。

private void SaveFilesToIsoStore()
    {
        //These files must match what is included in the application package,
        //or BinaryStream.Dispose below will throw an exception.
        string[] files = {
            "readme.htm"
        };

        IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication();

        if (false == isoStore.FileExists(files[0]))
        {
            foreach (string f in files)
            {
                StreamResourceInfo sr = Application.GetResourceStream(new Uri(f, UriKind.Relative));
                using (BinaryReader br = new BinaryReader(sr.Stream))
                {
                    byte[] data = br.ReadBytes((int)sr.Stream.Length);
                    SaveToIsoStore(f, data);
                }
            }
        }
    }

    private void SaveToIsoStore(string fileName, byte[] data)
    {
        string strBaseDir = string.Empty;
        string delimStr = "/";
        char[] delimiter = delimStr.ToCharArray();
        string[] dirsPath = fileName.Split(delimiter);

        //Get the IsoStore.
        IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication();

        //Re-create the directory structure.
        for (int i = 0; i < dirsPath.Length - 1; i++)
        {
            strBaseDir = System.IO.Path.Combine(strBaseDir, dirsPath[i]);
            isoStore.CreateDirectory(strBaseDir);
        }

        //Remove the existing file.
        if (isoStore.FileExists(fileName))
        {
            isoStore.DeleteFile(fileName);
        }

        //Write the file.
        using (BinaryWriter bw = new BinaryWriter(isoStore.CreateFile(fileName)))
        {
            bw.Write(data);
            bw.Close();
        }
    }

添加剩余的代码

修改页面后台代码以更新并包含以下两个函数,这两个函数将向独立存储中添加静态文件并在嵌入的 WebBrowser (WebView)控件中显示该内容。您将需要覆盖现有的 MainPage 函数。

{    InitializeComponent();

    SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape;

    webBrowser1.Loaded += WebBrowser_OnLoaded;
}

private void WebBrowser_OnLoaded(object sender, RoutedEventArgs e)
{
    SaveFilesToIsoStore();
    webBrowser1.Navigate(new Uri("readme.htm", UriKind.Relative));
}

3.  显示动态生成的 Web 内容

本主题介绍如何使用 WebBrowser (WebView)控件的 NavigateToString(String) 方法显示该控件中使用 XAML 和 C# 动态生成的 Web 内容。在使用该方法之前,您应该查看 WebBrowser (WebView)控件安全的注意事项。

可以使用工具添加 WebBrowser (WebView)控件,也可以手动添加 WebBrowser (WebView)控件。

使用工具添加 WebBrowser(WebView)控件

1. 在 Visual Studio 中打开一个新的或现有的解决方案。

2. 查看项目的 XAML 文件时,单击“工具箱”,将 WebBrowser (WebView)控件拖动到设备的图像中。

手动添加 WebBrowser(WebView)控件

在 XAML 中创建 WebBrowser (WebView)控件的步骤

1. 打开将在其中添加 WebBrowser (WebView)控件的页面的 XAML 文件。在“解决方案资源浏览器”中,右键单击该页面的 .xaml 文件(默认情况下,新应用程序的主页名为“MainPage.xaml”),然后选择“打开”。

2. 在 ContentGrid 中添加一个 WebBrowser (WebView)控件。例如:

Wp8:

<Grid x:Name="ContentGrid" Grid.Row="1">
    <phone:WebBrowser HorizontalAlignment="Left" Margin="20,50,0,0" Name="webBrowser1" VerticalAlignment="Top" Height="500" Width="430" />
</Grid>

Win8

<Grid x:Name="ContentGrid" Grid.Row="1">
    <WebView HorizontalAlignment="Left" Margin="20,50,0,0" Name="webView1" VerticalAlignment="Top" Height="500" Width="430" />
</Grid>

调用 NavigateToString

更新页面后台代码以包含对 NavigateToString 的调用。例如,如果使用的是具有默认命名约定的主页,则您将更新 MainPage.xaml.cs。以下示例代码描述了执行此操作的一个方法:

public MainPage()
{
      InitializeComponent();
      SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape;

      webBrowser1.Loaded += WebBrowser_OnLoaded;
}

private void WebBrowser_OnLoaded(object sender, RoutedEventArgs e)
{
      webBrowser1.NavigateToString("HTML Text"); 
}

Android的WebView

想添加一个WebView到应用当中,你只需要包含WebView标签到你的Activity布局文件当中。例如,下面是一个WebView填充满屏幕的布局。

<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android=http://schemas.android.com/apk/res/android 
android:id="@+id/webview" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
在WebView中载入网页,可以使用loadUrl()方法,例如:
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl("http://www.baidu.com");

在WebView中载入网页,可以使用loadUrl()方法,例如:

WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl("http://www.baidu.com");

这段代码运行之前,你需要接入到因特网中。你仅需要添加因特网权限到你的Manifest文件当中。

<manifest ... > 
<uses-permission android:name="android.permission.INTERNET" /> ...
</manifest>

这些是显示一个网页的基本知识。

在WebView中使用JavaScript

如果你想要载入的网页实现了JavaScript,你必须在WebView中开启JavaScript功能。当JavaScript有用时,你还可以再你的应用代码和JavaScript代码之间创建接口。

开启JavaScript

在WebView中JavaScript默认是不开启的。你可以通过WebSettings添加到WebView当中开启它。你可以使用getSettings()方法获得WebSettings,然后使用setJavaScriptEnabled()来开启它。 例如:

WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);

在WebSettings中你可以发现很多有用的功能。例如,如果你使用WebView开发一个网络应用,你可以使用setUserAgentString()方法定义一个自定义用户代理字符串,后面可以查询网页中的自定义用户代理,辨别当前请求网页的是不是你的Android应用。

绑定JavaScript代码到Android源码

当在应用当中使用WebView创建网络应用的时候,你可以在JavaScript和Android源码之间创建一个接口,例如,你的JavaScript代码可以调用Android中定义的方法来显示一个对话框,而不使用JavaScript的alert()方法。

例如你可以在应用当中添加以下的类:

public class JavaScriptInterface {
Context mContext;
/** Instantiate the interface and set the context */
JavaScriptInterface(Context c) { 
mContext = c; 
}
/** Show a toast from the web page */ 
public void showToast(String toast) { 
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); 
}
}

在这个例子中,JavaScriptInterface类使用showToast()方法创建Toast消息。

你可以绑定这个类到JavaScript当中并在WebView当中使用addJavaScriptInterface()方法运行并创建接口的名称为Android。

WebView webView = (WebView) findViewById(R.id.webview);
webView.addJavascriptInterface(new JavaScriptInterface(this), "Android");

这段代码会创建一个名称为“Android”的JavaScript接口并运行在WebView当中。在这里,你的Web应用会接入到JavaScriptInterface类。例如,下面为Html何JavaScript代码,它会在用户点击按钮的时候使用新的接口创建一个Toast消息。

<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" />
<script type="text/javascript">
    function showAndroidToast(toast) {
        Android.showToast(toast);
    }
</script>

处理页面导航

当用户在你的WebView中点击一个链接时,对于Android来说默认的动作时启动一个应用程序捕捉它。通常,默认的网页浏览器会打开并且载入目标URL。然而,你可以在WebView中重写该动作,把该链接在你的WebView中打开。你还可以让用户自己处理历史的回退和前进功能。

打开用户点击的链接,仅仅在WebView中提供WebViewClient即可,使用setWebViewClient()方法。例如:

WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(new WebViewClient());

完成,现在用户点击的所有链接都会在WebView中打开。如果你想要在点击链接并载入网页的时候做更多的操作,请创建自己的WebViewClient 并重写java.lang.String) shouldOverrideUrlLoading()方法。例如:

private class MyWebViewClient extends WebViewClient { 
@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 
if (Uri.parse(url).getHost().equals("www.example.com")) { 
//这是我的网页,所以不要重写,让我的WebView载入它
return false; 
} 
// 如果不是我的网页,则启动另外的Activity来处理该URL
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
startActivity(intent); 
return true; 
}
}

然后给WebView创建一个WebViewClient的实例。

WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(new MyWebViewClient());

现在当用户点击一个链接,系统会调用java.lang.String) shouldOverrideUrlLoading() , 它会辨别URL主机是否要匹配指定的域名(就像我们上面列举的一样)。如果它不能匹配,则该方法返回false,一个Intent会创建并启动默认的Activity来处理该URL(它一般解析为用户的默认浏览器)。

操作网页历史

当你的WebView重写URL的载入,它会自动累积访问过的网页历史。你可以使用goBack()方法和goForward()方法操纵回退和向前功能。 例如,下面是Activity使用返回按钮操作“回退”功能。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// Check if the key event was the Back button and if there's history
if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack() { 
myWebView.goBack(); 
return true; 
} 
// If it wasn't the Back key or there's no web page history, bubble up to the default 
// system behavior (probably exit the activity) 
return super.onKeyDown(keyCode, event);
}

如果有网页历史则canGoBack()方法返回True,同样的,你可以使用canGoForward()来检查是否有“前进”历史。如果你不执行这个检查,当用户到达历史的尽头的时候,goBack()和goForward()什么都不做。

六、获取和设置 Cookie

WP8

注意: 如果服务器发送 HTTPOnly Cookie,则应在请求上创建一个System.Net.CookieContainer 用于保存 Cookie,尽管将无法看到或访问该容器中存储的 Cookie。如果不创建容器来保存 Cookie,则请求将失败。有关 HTTPOnly Cookie 的更多信息,请参见HTTPOnly cookies

设置请求消息上的 Cookie

1. 为 HttpWebRequest 的 HttpWebRequest.CookieContainer 属性创建一个System.Net.CookieContainer对象。

request.CookieContainer = new CookieContainer();

2. 使用 CookieContainer.Add 方法将 Cookie 对象添加到HttpWebRequest.CookieContainer

request.CookieContainer.Add(new Uri("http://windowsteamblog.com/windows_phone/b/windowsphone/rss.aspx"),
    new Cookie("id", "1234"));

获取响应消息上的 Cookie

1. 在请求上创建一个 System.Net.CookieContainer 以保存对响应发送的 Cookie 对象。即使没有发送任何 Cookie 也必须执行此操作。

request.CookieContainer = new CookieContainer();

2. 检索 HttpWebResponse 的 HttpWebResponse.Cookies 属性中的值。在此示例中,将检索 Cookie 并将它们保存到独立存储中。

private void ReadCallback(IAsyncResult asynchronousResult)
{
    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
    HttpWebResponse response = (HttpWebResponse)
        request.EndGetResponse(asynchronousResult);
    using (IsolatedStorageFile isf =
        IsolatedStorageFile.GetUserStoreForApplication())
    {
        using (IsolatedStorageFileStream isfs = isf.OpenFile("CookieExCookies",
            FileMode.OpenOrCreate, FileAccess.Write))
        {
            using (StreamWriter sw = new StreamWriter(isfs))
            {
                foreach (Cookie cookieValue in response.Cookies)
                {
                    sw.WriteLine("Cookie: " + cookieValue.ToString());
                }
                sw.Close();
            }
        }

    }
}

示例

下面的示例演示如何创建 Web 请求并向该请求添加 Cookie。此示例还演示如何从 Web 响应提取 Cookie,如何将 Cookie 写入独立存储中的文件以及从独立存储中进行读取。运行此示例时,将在 TextBlock 控件中显示 System.Net.Cookie 值。

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Net.Browser;
using System.IO;
using System.Text;
using System.IO.IsolatedStorage;


namespace CookiesEx
{
    public partial class MainPage : PhoneApplicationPage
    {

        public MainPage()
        {
            InitializeComponent();

        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            InitializeWebRequestClientStackForURI();
            ReadFromIsolatedStorage();
        }

        private void InitializeWebRequestClientStackForURI()
        {

            // Create a HttpWebRequest.
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri("http://windowsteamblog.com/windows_phone/b/windowsphone/rss.aspx"));

            //Create the cookie container and add a cookie.
            request.CookieContainer = new CookieContainer();


            // This example shows manually adding a cookie, but you would most
            // likely read the cookies from isolated storage.
            request.CookieContainer.Add(new Uri("http://windowsteamblog.com/windows_phone/b/windowsphone/rss.aspx"),
                new Cookie("id", "1234"));

            // Send the request.
            request.BeginGetResponse(new AsyncCallback(ReadCallback), request);
        }

        // Get the response and write cookies to isolated storage.
        private void ReadCallback(IAsyncResult asynchronousResult)
        {
            HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
            HttpWebResponse response = (HttpWebResponse)
                request.EndGetResponse(asynchronousResult);
            using (IsolatedStorageFile isf =
                IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (IsolatedStorageFileStream isfs = isf.OpenFile("CookieExCookies",
                    FileMode.OpenOrCreate, FileAccess.Write))
                {
                    using (StreamWriter sw = new StreamWriter(isfs))
                    {
                        foreach (Cookie cookieValue in response.Cookies)
                        {
                            sw.WriteLine("Cookie: " + cookieValue.ToString());
                        }
                        sw.Close();
                    }
                }

            }
        }
        private void ReadFromIsolatedStorage()
        {
            using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (IsolatedStorageFileStream isfs =
                   isf.OpenFile("CookieExCookies", FileMode.OpenOrCreate))
                {
                    using (StreamReader sr = new StreamReader(isfs))
                    {
                        tb1.Text = sr.ReadToEnd();
                        sr.Close();
                    }
                }

            }
        }
    }
}

XAML

<phone:PhoneApplicationPage x:Class="CookiesEx.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800">
    <StackPanel x:Name="LayoutRoot" Width="390">
         <Button Width="372" Height="173" Content="Click to send request" 
                HorizontalAlignment="Left"
                x:Name="button1" Click="button1_Click" Margin="5"/>
        <TextBlock TextWrapping="Wrap" Foreground="{StaticResource PhoneForegroundBrush}" Height="267" Name="tb1" Width="382" FontSize="22" />
    </StackPanel>
</phone:PhoneApplicationPage>

Win8

WinRT对WebView的功能做了很多的限制,所以本身webview控件是获取不到cookie我们可以用HttpWebRequestCookieContainer来完成cookie的设置。

Android

在android里面,为使HttpClient中保存下来的Cookie设置到WebView组件里,让WebView也保持住Cookie状态,我们需要用到CookieSyncManager和CookieManager类。在webView调用webView.loadUrl方法之前做以下设置即可给WebView设置Cookie

CookieSyncManager.createInstance(context);  
CookieManager cookieManager = CookieManager.getInstance();  
cookieManager.setAcceptCookie(true);  
cookieManager.removeSessionCookie();//移除  
cookieManager.setCookie(url, cookies);//cookies是在HttpClient中获得的cookie  
CookieSyncManager.getInstance().sync();
举报
顶部