最近,我正在开发一个Windows Phone项目。在这个项目中,为了验证用户,我需要检查3个Web API,逻辑如下: 第1步:访问web api 1以获取令牌 步骤2:访问web api 2以通过步骤1中检索到的令牌获取用户名/密码 步骤3:访问Web API 3以在步骤2中验证用户名/密码
您可以看到我们需要按顺序访问这3个API。众所周知,窗口电话现在异步访问网络,这对于按顺序进行这些API访问造成了巨大的挑战,并且使得源代码难以维护。
我也考虑下面的同步源代码,但我发现访问网络存在一些问题,会引发很多异常。例如,当抛出异常时,我尝试使用异步Web请求来访问相同的URL,这没关系。我现在正在努力奋斗。我必须引入线程来调用它以避免阻塞UI线程。
内部静态类HttpWebRequestExtensions { public const int DefaultRequestTimeout = 60000;
public static bool IsHttpExceptionFound = false;
public static WebResponse GetResponse(this WebRequest request, int nTimeOut = DefaultRequestTimeout)
{
var dataReady = new AutoResetEvent(false);
HttpWebResponse response = null;
var callback = new AsyncCallback(delegate(IAsyncResult asynchronousResult)
{
try
{
response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
dataReady.Set();
}
catch(Exception e)
{
IsHttpExceptionFound = true;
}
});
request.BeginGetResponse(callback, request);
if (dataReady.WaitOne(nTimeOut))
{
return response;
}
return null;
}
public static WebResponse PostRequest(this HttpWebRequest request, String postData, int nTimeOut = DefaultRequestTimeout)
{
var dataReady = new AutoResetEvent(false);
HttpWebResponse response = null;
var callback = new AsyncCallback(delegate(IAsyncResult asynchronousResult)
{
Stream postStream = request.EndGetRequestStream(asynchronousResult); //End the operation.
byte[] byteArray = Encoding.UTF8.GetBytes(postData); //Convert the string into a byte array.
postStream.Write(byteArray, 0, postData.Length); //Write to the request stream.
postStream.Close();
dataReady.Set();
});
request.BeginGetRequestStream(callback, request);
if (dataReady.WaitOne(nTimeOut))
{
response = (HttpWebResponse)request.GetResponse(nTimeOut);
if (IsHttpExceptionFound)
{
throw new HttpResponseException("Failed to get http response");
}
return response;
}
return null;
}
}
有关使用异步Web请求解决我的案例的任何建议吗?
答案 0 :(得分:0)
这里有一个使用异步Web服务以链接方式在WP7上调用Microsoft Translator服务的示例
也许会给你一些指示? http://blogs.msdn.com/b/translation/p/wp7translate.aspx