最近,我在 Windows Phone 上做一个项目。在这个项目中,要验证用户,我需要检查 3 个 web API,逻辑如下: 步骤 1:访问 web api 1 以获取令牌 步骤 2:访问 web api 2 以获取用户名/密码第 1 步中检索到的令牌 第 3 步:访问 Web API 3 以验证第 2 步中的用户名/密码
你可以看到我们需要按顺序访问这 3 个 API。众所周知,window phone现在是异步访问网络,这给这些API访问的有序性带来了很大的挑战,也使得源代码难以维护。
我也考虑了下面的同步源代码,但是我发现访问网络有一些问题,会抛出很多异常。比如抛出异常时,我尝试使用异步web请求访问同一个URL,就OK了。我现在很努力。而且我必须引入线程来调用它以避免阻塞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 请求来解决我的问题有什么建议吗?