Windows Phone在呼叫中按顺序发送多个Web请求

时间:2013-04-19 02:41:15

标签: windows-phone-7 httpwebrequest windows-phone-8

最近,我正在开发一个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请求解决我的案例的任何建议吗?

1 个答案:

答案 0 :(得分:0)

这里有一个使用异步Web服务以链接方式在WP7上调用Microsoft Translator服务的示例

也许会给你一些指示? http://blogs.msdn.com/b/translation/p/wp7translate.aspx