【问题标题】:HTTPS POST in C#, Winforms (Stream Writer, HttpWebResponse, HttpWebRequest)C# 中的 HTTPS POST、Winforms(流编写器、HttpWebResponse、HttpWebRequest)
【发布时间】:2012-04-02 14:29:14
【问题描述】:

更新:我正在尝试将数据发布到 https URI。 POST 适用于 HTTP,但适用于 HTTPS uri


您好,我正在创建一个 c# winforms exe 来将数据发布到网站。代码如下。问题是,流复制了我的帖子数据..

例如:假设我想发布这个 -> username=bob

那我查流量的时候,实际发送的是,username=bobusername=bob

看到了吗?它复制,它再次将同一行添加到缓冲区的末尾并发送它。

两天后我想找到这个问题我快疯了。任何人都可以解决这个问题或给我一些提示吗?谢谢你。。

(内容长度正确设置为 12,但它发送 24 个字节,再次将相同的数据附加到缓冲区的尾部)

有标题

POST /login/ HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Host: abc.test.com
Content-Length: 12

username=bobusername=bob
-

这是我目前使用的代码

string post_data = "username=bob";
string uri = "https://abc.test.com/login/";

HttpWebRequest request = (HttpWebRequest)
WebRequest.Create(uri); 
request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
request.Method = "POST";

byte[] postBytes = Encoding.ASCII.GetBytes(post_data);

request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postBytes.Length;

Stream requestStream = request.GetRequestStream();

requestStream.Write(postBytes, 0, postBytes.Length);

MessageBox.Show(postBytes.Length.ToString());
requestStream.Close();

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
string tmp = sr.ReadToEnd().Trim();

我在byte[] postBytes = Encoding.ASCII.GetBytes(post_data);postBytes 上设置了一个断点,其中包含正确的数据...但它会输出两次。

为什么会这样?我希望我很清楚..

【问题讨论】:

    标签: c# winforms post https


    【解决方案1】:

    您可以尝试通过设置跟踪配置来获取更多信息,如page 中所述。当我尝试您的代码时,我得到以下输出:

    System.Net Verbose: 0 : [2324] Data from ConnectStream#26756241::Write
    System.Net Verbose: 0 : [2324] 00000000 : 75 73 65 72 6E 61 6D 65-3D 62 6F 62             : username=bob
    System.Net Verbose: 0 : [2324] Exiting ConnectStream#26756241::Write()
    

    看起来数据已正确写入 ConnectStream。其他地方出了什么问题?

    别忘了关闭 WebResponse 对象。

    【讨论】:

    • hi jiaji wu,感谢您的宝贵时间和帮助。我尝试关闭网络响应。但它仍然发送重复。是的,其他地方出了点问题..
    【解决方案2】:

    我尝试了您的代码,在我将 URI 中的主机更改为可寻址的内容(使用 http://adsf.com/login)后,它似乎按预期工作(发送了一个带有 12 字节有效负载的 HTTP Post)。这是来自wireshark的跟踪:

    你可以试试我用来查看你得到什么的 URI,这至少可以排除你的计算机或代码可能是问题的根源。如果在使用不同的 URI 时问题消失了,那么问题可能出在您的网络设备和 Web 服务器之间(反向代理配置、Web 服务器配置、网络交换机配置等)。

    【讨论】:

    • 嗨,Darwyn,感谢您的时间和帮助。我尝试了这个新的 URI,并注意到,现在我的 exe 发送了正确的数据。但我发现有趣的是,只有当它的 HTTPS 请求.. 对于 HTTP 链接,它的 buff 只连接一个 tiem.. 所以有人知道为什么对于 HTTPS(安全)连接,数据是重复的吗?我正在尝试发送到 HTTPS 站点..(现在编辑了我的问题)
    • 对 HTTPS 失败,对 HTTP 有效。不幸的是,我想发布到 HTTPS URI...
    猜你喜欢
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    相关资源
    最近更新 更多