我正在尝试将一些代码从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背后的资源,因此需要模块化设计。
有没有办法“强制”同步?
由于
答案 0 :(得分:1)
您仍然可以使用异步模型继续执行回调功能。或者您可以使用可与HttpClient
关键字一起使用的新await
,以便您可以以同步方式对内容进行编程。
您可以通过nuget获取HttpClient
install-package Microsoft.Net.Http