坠翼神祇 发表于 2013-1-4 01:15:07

乱舞WindowsPhone——同步HttpWebRequest通信的实现以及连接超时的实现

<div id="cnblogs_post_body">WindowsPhone中HttpWebRequest没有提供同步通信方法,我们只能用异步调用,可以使用信号量来模拟同步通信:
这里通过AutoResetEvent对象实现,初始设置为Reset,在Response回调方法中置为Set,通过WaitOnt()控制超时时间
具体详见代码
<div class="cnblogs_code" >http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gifhttp://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gifView Code <div id="cnblogs_code_open_49a51bf8-3978-4925-8131-8c974d3f31ec" class="cnblogs_code_hide">public class HttpAdapter    {      HttpWebRequest request;      byte[] bSendingFile;          //发送信息      String strResponese;          //返回字符串      AutoResetEvent resetEvent;    //信号量      public HttpAdapter()      {            strResponese = String.Empty;            resetEvent = new AutoResetEvent(false);      }      /// <summary>      /// 执行Http连接操作      /// </summary>      /// <param name="xmlRequest">要发送的xml字符串</param>      /// <returns>返回字符串</returns>      public string ProcessHttp(String xmlRequest)      {                if(request!=null)                  request.Abort();                bSendingFile = Encoding.UTF8.GetBytes(xmlRequest);                resetEvent.Reset();                Thread t = new Thread(new ThreadStart(ProcessHttpWithAsyn));                t.Start();                resetEvent.WaitOne(30000);                if (strResponese == String.Empty)                {                  if (request != null)                        request.Abort();                  strResponese = "TimeOut";                }                return strResponese;                  }      /// <summary>      /// 执行Http连接操作      /// </summary>      /// <param name="xmlRequest">要发送的xml字符串</param>      /// <param name="timeOut">设置超时时间(秒)</param>      /// <returns></returns>      public string ProcessHttp(String xmlRequest, int timeOut)      {                           bSendingFile = Encoding.UTF8.GetBytes(xmlRequest);                resetEvent.Reset();                Thread t = new Thread(new ThreadStart(ProcessHttpWithAsyn));                t.Start();                resetEvent.WaitOne(timeOut);                if (strResponese == String.Empty)                {                  if (request != null)                        request.Abort();                  strResponese = "TimeOut";//timeout 连接超时                }                return strResponese;            }      /// <summary>      /// 异步方式调用Http协议      /// </summary>      public void ProcessHttpWithAsyn()      {            request = (HttpWebRequest)WebRequest.Create(new Uri(CommonInfo.ReceiveUri));            request.ContentType = "text/xml;charset=UTF-8";            request.Method = "POST";            request.BeginGetRequestStream(RequestStreamCallback, request);      }      /// <summary>      /// 返回用于将数据写入Stream,写入数据,并发送      /// </summary>      /// <param name="result"></param>      private void RequestStreamCallback(IAsyncResult result)      {            HttpWebRequest request = (HttpWebRequest)(result.AsyncState);            Stream requestStream = request.EndGetRequestStream(result);            requestStream.Write(bSendingFile, 0, bSendingFile.Length);            requestStream.Flush();            requestStream.Close();            request.BeginGetResponse(WebResponseCallback, request);      }      /// <summary>      /// Http请求结束后调用的回调方法      /// </summary>      /// <param name="result"></param>      private void WebResponseCallback(IAsyncResult result)      {            try            {                HttpWebRequest request = (HttpWebRequest)(result.AsyncState);                WebResponse response = request.EndGetResponse(result) as HttpWebResponse;                if (response != null)                {                  Stream responseStream = response.GetResponseStream();                  using (StreamReader streamReader = new StreamReader(responseStream))                  {                        strResponese = streamReader.ReadToEnd();                  }                  resetEvent.Set();                }            }            catch (Exception e)            {                strResponese ="NetEx";                resetEvent.Set();            }      }    }
页: [1]
查看完整版本: 乱舞WindowsPhone——同步HttpWebRequest通信的实现以及连接超时的实现