这个HttpWebRequest/HttpWebResponse/StreamReader代码是否有意义? [英] Does this HttpWebRequest/HttpWebResponse/StreamReader code even make sense?

查看:194
本文介绍了这个HttpWebRequest/HttpWebResponse/StreamReader代码是否有意义?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

而不是添加我的问题在这里,我要添加一个新的,因为一旦我在安装了X射线视觉护目镜的情况下看了我的代码,就不会发现它了.

Rather than add on to my question here, I'm adding a new one as, once I looked at my code with my X-Ray vision goggles attached, I don't grok it.

我什至不记得我从哪里得到了这段代码,但这是我在某个地方找到的示例的改编.但是,似乎数据甚至都没有发送到服务器.具体来说,此代码:

I don't even remember where I got this code, but it's an adaptation of an example I found somewhere. Yet it doesn't seem that the data is even being sent to the server. To be specific, this code:

public static string SendXMLFile(string xmlFilepath, string uri)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);

    request.KeepAlive = false;
    request.ProtocolVersion = HttpVersion.Version10;

    request.Method = "POST";

    StringBuilder sb = new StringBuilder();
    using (StreamReader sr = new StreamReader(xmlFilepath))
    {
        String line;
        while ((line = sr.ReadLine()) != null)
        {
            // test to see if it's finding any lines
            //MessageBox.Show(line); <= works fine
            sb.AppendLine(line);
        }
        byte[] postBytes = Encoding.UTF8.GetBytes(sb.ToString());

        request.ContentLength = postBytes.Length;
        // Did the sb get into the byte array?
        //MessageBox.Show(request.ContentLength.ToString()); <= shows "112" (seems right)
        request.KeepAlive = false;

        request.ContentType = "application/xml";

        try
        {
            Stream requestStream = request.GetRequestStream();
            // now test this: MessageBox.Show() below causing exception? See https://stackoverflow.com/questions/22358231/why-is-the-httpwebrequest-body-val-null-after-crossing-the-rubicon
            //MessageBox.Show(string.Format("requestStream length is {0}", requestStream.Length.ToString()));
            requestStream.Write(postBytes, 0, postBytes.Length);
            MessageBox.Show(string.Format("requestStream length is {0}", requestStream.Length.ToString()));
            requestStream.Close();

            using (var response = (HttpWebResponse)request.GetResponse())
            {
                return response.ToString();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("SendXMLFile exception " + ex.Message);
            request.Abort();
            return string.Empty;
        }
    }
}

...似乎正在这样做:

...seems to be doing this:

0) Reads the contents of the file at xmlFilepath and puts it into a StreamReader ("sr")
1) A StringBuilder ("sb") is populated with the contents of the StreamReader
2) The contents of the StringBuilder are put into an array of Bytes ("postBytes")
- then here comes the weird part (or so it seems to me, after analyzing the code more closely):
3) The contents of the array of bytes are written to a Stream ("requestStream")
4) The Stream is closed (???)
5) The HttpWebRequest ("request") attempts to return a HttpWebResponse by calling GetResponse()

  • 但是请求"包含什么?内容(StreamReader => StringBuilder =>字节数组=> Stream)永远不会分配给它!似乎Stream的存在仅仅是为了编写代码行,加热处理器并减慢操作速度!
  • 此代码是荒谬的,还是我只是不喜欢它?

    Is this code nonsensical, or am I just not grokking it?

    推荐答案

    GetRequestStream()返回一个流,该流将通过HttpWebRequest的写入转发到网络.
    您的代码不必要长,但正确.

    GetRequestStream() returns a stream that forwards writes through the HttpWebRequest to the network.
    Your code is unnecessarily long, but correct.

    但是,response.ToString()是错误的;您想用StreamReader阅读response.GetResponseStream().

    However, response.ToString() is wrong; you want to read response.GetResponseStream() with a StreamReader.

    这篇关于这个HttpWebRequest/HttpWebResponse/StreamReader代码是否有意义?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆