none
如何同步HTTP POST? RRS feed

  • 问题

  • silverlight只支持异步的线程模型,而从Web访问数据使用http post方法是经常使用的,我希望使用http post从web访问数据,所以使用了如下异步方法:

            public static HttpPost Create(Uri uri, string postData)
            {
                var result = new HttpPost();
                var request = (HttpWebRequest)HttpWebRequest.Create(uri);
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.BeginGetRequestStream((streamResult) =>
                {
                    var writer = new StreamWriter(request.EndGetRequestStream(streamResult));
                    writer.Write(postData);
                    writer.Close();
                    
                    request.BeginGetResponse((responseResult) =>
                    {
                        var response = (HttpWebResponse)request.EndGetResponse(responseResult);
                        var reader = new StreamReader(response.GetResponseStream());
                        var msg = reader.ReadToEnd();
                        reader.Close();
                        result.StreamRecieved(null, new MessageRecievedEventArgs(msg));
                    }, request);
                }, request);
                return result;
            }
    

    该方法使用一个uri作为post的地址,一个postData作为需要post的内容,方法返回一个自建的HttpPost对象,该对象保存一个StreamRecieved事件,如果Web请求完成,即产生该事件

    要知道这是一种典型的异步模型,可以通过事件的方法进行同步,但我可能需要同步作很有HTTP POST,像这样:

    var mrl = new ManualResetEvent(false);
                HttpPost.Create("http://sdcb.sinaapp.com/game/close_light/data.php", "action=get_map_count&row=5&column=5").StreamRecieved += (o, e) =>
                {
                    count = int.Parse((string)e.Message);
                    mrl.Set();
                };
                mrl.WaitOne();
    
    但这种办法总是不正常工作,单步调试总是停留在
                    var writer = new StreamWriter(request.EndGetRequestStream(streamResult));
    
    

    这一行代码,请问是为什么?

    2011年11月14日 14:45

答案

全部回复

  • 你好,

    请问如果你不模拟同步会出现上述问题吗?或者说可以得到预期的结果吗?


    Daoping Liu - MSFT
    2011年11月16日 6:44
    版主
  • <pre lang="x-c#">你好,Daoping Liu,不模拟同步是一切正常的,也就是说,如果将关键代码换成:
    
    var mrl = new ManualResetEvent(false);
    HttpPost.Create("http://sdcb.sinaapp.com/game/close_light/data.php", "action=get_map_count&row=5&column=5").StreamRecieved += (o, e) =>
    {
        count = int.Parse((string)e.Message);
        // mrl.Set();
    };
    // mrl.WaitOne();
    
    就不会出问题
    
    2011年11月16日 10:28
  • 补充一下,如果模拟同步,则代码是在

    var writer = new StreamWriter(request.EndGetRequestStream(streamResult));
    
    
    一句中终止运行,终止运行后调试器一直停留在

    mrl.WaitOne();
    
    一句上
    

    2011年11月16日 10:31
  • 你好,Daoping Liu,不模拟同步是一切正常的,可以得到预期的结果
    2011年11月21日 13:16
  • 不模拟同步是一切正常的,可以得到预期的结果,有谁可以为我解决难题?
    2011年11月23日 14:20
  • 没必要同步,可以使用.NET事件模型+DispatherObject来解决
    • 已标记为答案 Flysha 2012年1月8日 1:34
    2012年1月8日 1:34