1

我正在尝试将一些代码从 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 背后的资源,因此它需要模块化设计。

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

谢谢

4

1 回答 1

1

您仍然可以使用异步模型在回调函数中继续您的步骤。或者您可以使用HttpClient可以与await关键字一起使用的 new,这样您就可以以同步的方式对您的内容进行编程。

你可以HttpClient通过nuget

install-package Microsoft.Net.Http
于 2013-05-28T20:37:07.557 回答