0

最近,我在 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 请求来解决我的问题有什么建议吗?

4

1 回答 1

0

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

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

于 2013-04-19T03:13:25.133 回答