如何使用开始/结束GetRequestStream和回调正确发布数据

问题描述 投票:0回答:1

我正在尝试发布一段数据,但它似乎被抓住并挂起(但不会抛出错误)。

 internal IAsyncResult RequestGet<TPostType>(Action<string> callback, string path, TPostType value)
    {
        var http = (HttpWebRequest)WebRequest.Create(Connection.GetUri(path).Uri);
        http.Accept = "application/json";
        http.ContentType = "application/json";
        http.Method = "POST";

        var parsedContent = JsonConvert.SerializeObject(value);
        var encoding = new ASCIIEncoding();
        var bytes = encoding.GetBytes(parsedContent);

        return http.BeginGetRequestStream(ar => 
        {
            try
            {
                var stream = http.EndGetRequestStream(ar);
                stream.Write(bytes, 0, bytes.Length);
                stream.Close();

                http.BeginGetResponse(body =>
                {         
// its around here that it hangs.
                    var response = http.EndGetResponse(ar);

                    var s = response.GetResponseStream();

                    ReadStream(callback, s);

                }, null);
            }
            catch (WebException webex)
            {
                WebResponse errResp = webex.Response;

                using (Stream respStream = errResp.GetResponseStream())
                {
                    Console.WriteLine(new StreamReader(respStream).ReadToEnd());
                }
            }
        }, null);
    }

有几次它没有挂起但告诉我请求机构丢失了,但是我没有取得任何进展。有人可以告诉我我做错了什么吗?

ReadStream方法适用于GET请求,但对于上下文:

private static IAsyncResult ReadStream(Action<string> callback, Stream stream)
    {
        var buffer = new byte[5000];

        var asyncResult = stream.BeginRead(buffer, 0, 5000, ar2 =>
        {
            try
            {
                callback(Encoding.UTF8.GetString(buffer, 0, 5000));
            }
            catch (Exception ex)
            {
                // do better error handling
                Console.WriteLine("exception reading stream");
                Console.WriteLine(ex);
            }
        }, null);

        return asyncResult;
    }

有关如何使用它的更多背景信息:

 public IAsyncResult BeginGetChainPart(Action<BlockData.BlockList> callback, int height)
    {
        var asyncResult = new HttpConnector(Connection).RequestGet(body =>
        {
            callback(JsonConvert.DeserializeObject<BlockData.BlockList>(body));
        }, "/local/chain/blocks-after", new BlockData.BlockHeight { Height = height });

        return asyncResult;          
    }
c# .net asynchronous
1个回答
0
投票

找到解决方案,以防万一有人遇到同样的问题:

        internal IAsyncResult RequestGet<TPostType>(Action<string> callback, string path, TPostType value)
    {
        var http = (HttpWebRequest)WebRequest.Create(Connection.GetUri(path).Uri);
        http.Accept = "application/json";
        http.ContentType = "application/json";
        http.Method = "POST";

        var parsedContent = JsonConvert.SerializeObject(value);
        var encoding = new ASCIIEncoding();
        var bytes = encoding.GetBytes(parsedContent);

        return http.BeginGetRequestStream(ar => {
            try
            {
                var stream = http.EndGetRequestStream(ar);  

                stream.Write(bytes, 0, bytes.Length);

                stream.Close();

                var response = http.GetResponse();

                var responseStream = response.GetResponseStream();

                ReadStream(callback, responseStream);

            }
            catch (WebException webex)
            {
                WebResponse errResp = webex.Response;

                using (Stream respStream = errResp.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(respStream);

                    string text = reader.ReadToEnd();

                    Console.WriteLine(text);
                }
            }
        }, null);
    }
© www.soinside.com 2019 - 2024. All rights reserved.