我正在尝试将一些代码从 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 背后的资源,因此它需要模块化设计。
有没有办法“强制”同步?
谢谢