让WP8 Web请求同步

时间:2013-05-28 20:20:06

标签: windows-phone-8 httpwebrequest windows-phone .net-4.5

我正在尝试将一些代码从Windows窗体应用程序移植到WP8,并且遇到了一些有关异步调用的问题。 基本思想是进行一些UAG身份验证。在Windows窗体代码中,我在门户主页上进行GET并等待cookie。然后,我将这些cookie传递给对UAG服务器的验证URL的POST请求。这一切都在表单中工作正常,因为所有步骤都是顺序和同步的。

现在,当我开始将其移植到WP8时,我注意到的第一件事是GetResponse()不可用,而是我必须使用BeginGetResponse(),它是异步的并且调用回调函数。这对我没有好处,因为我需要确保在执行POST之前完成此步骤

我的Windows表单代码如下所示(取自http://usingnat.net/sharepoint/2011/2/23/how-to-programmatically-authenticate-to-uag-protected-sharep.html):

 private void Connect()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(this.Url);
            request.CookieContainer = new CookieContainer();
            request.UserAgent = this.UserAgent;
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                //Get the UAG generated cookies from the response
                this.Cookies = response.Cookies;
            }
       }

private void ValidateCredentials()
        {
        //Some code to construct the headers goes here...
       HttpWebRequest postRequest = (HttpWebRequest)WebRequest.Create(this.ValidationUrl);
       postRequest.ContentType = "application/x-www-form-urlencoded";
       postRequest.CookieContainer = new CookieContainer();
       foreach (Cookie cookie in this.Cookies)
        {
           postRequest.CookieContainer.Add(cookie);
        }
      postRequest.Method = "POST";
      postRequest.AllowAutoRedirect = true;

      using (Stream newStream = postRequest.GetRequestStream())
      {
          newStream.Write(data, 0, data.Length);
      }
      using (HttpWebResponse response = (HttpWebResponse)postRequest.GetResponse())
      {
          this.Cookies = response.Cookies;
      }

public CookieCollection Authenticate()
        {
            this.Connect();
            this.ValidateCredentials();
            return this.Cookies;
        }

问题在于此代码依赖于同步操作(首先调用Connect(),然后调用ValidateCredentials()),似乎WP8不支持Web请求。我可以将这两个函数合并为一个,但这不能完全解决我的问题,因为稍后需要扩展以访问UAG背后的资源,因此需要模块化设计。

有没有办法“强制”同步?

由于

1 个答案:

答案 0 :(得分:1)

您仍然可以使用异步模型继续执行回调功能。或者您可以使用可与HttpClient关键字一起使用的新await,以便您可以以同步方式对内容进行编程。

您可以通过nuget获取HttpClient

install-package Microsoft.Net.Http