【问题标题】:C# post to different serverC# 发布到不同的服务器
【发布时间】:2012-07-26 23:21:26
【问题描述】:

我正在使用 c# 并尝试将数据发布到另一台服务器上的表单,该表单包含一个图像附件以及一些参数,例如:

名字 = 名字 姓氏 = 最后 图片 = ImageFile.JPG

寻找一个如何构造一个方法来发送这个的例子我一直在研究 HttpWebRequest 但需要一个例子。

【问题讨论】:

  • “另一台服务器”上的此其他表单 - 您不控制此表单?即它是第 3 方?
  • 不是直接的,但我可以找人对其进行更改
  • 网页上的当前实现 - 我假设它使用 JPG 的 type=file 的输入元素?
  • 我有看起来应该工作的东西,但它没有。想不通为什么!我不确定这里发布无效答案的协议是什么,所以我不会。今晚我会有更多的时间来看看它。如果我让它工作,我会发布它。如果没有,我会通过电子邮件向您发送我所拥有的。

标签: c# httpwebrequest form-post


【解决方案1】:

一个更简单的 HttpWebRequest 替代方案是 WebClient 类。上传名称值对:

        using (var c = new WebClient())
        {
            var values = new NameValueCollection();
            values.Add("key1", "value1");
            c.UploadValues("http://www.acme.org/", "POST", values);
        }

【讨论】:

    【解决方案2】:

    我现在有这个工作 - 我的测试是使用 ASP.NET 托管的网页......但基本技术应该可以在任何地方工作。

    手动发布到 Web 服务器可能会有点棘手。我总是从 HttpWatch 之类的好工具开始 - 我在页面上发布一个真实的帖子,然后使用该工具查看它发布的内容,查看发送的标头,并查看发送的 cookie。

    在这种情况下,标头中的内容类型设置为multipart/form-data,并定义了边界。然后查看流,您可以看到字节是如何发送到服务器的。

    完成这些步骤后,您只需弄清楚如何从 c# 发送相同的字节。

    此示例代码仅显示一个工作示例。显然,生产代码需要更进一步:

    1) 它将首先连接以获得新的 __VIEWSTATE 和 __EVENTVALIDATION 参数,而不是像我在这里那样硬连线它们。

    2) 它会查看表单参数(fname、lname)并确认它们的名称。

    3) 它可能会寻找新的参数。

    4) 每次都可能生成boundry。不确定这个,但浏览器是这样做的。

    5) 文件名不会硬连线。

    6) 可能有一种更有效的方法来创建最终字节数组。

    代码如下:

        private void SimulatePost_Click(object sender, EventArgs e)
        {
            WebClient client = new WebClient();
    
            const string boundry = "---------------------------7dc2a722a12c8";
    
            string contentType = string.Format("multipart/form-data; boundary={0}", boundry);
    
            string postData = string.Format(@"--{0}
    Content-Disposition: form-data; name=""__VIEWSTATE""
    
    /wEPDwUKLTk2MDkyMzQyMw9kFgJmD2QWAgIDDxYCHgdlbmN0eXBlBRNtdWx0aXBhcnQvZm9ybS1kYXRhZGQLrqV5FQTzi8K9ogSJlS44c0L0Ou3+MaYfFPwjKPwjZQ==
    --{0}
    Content-Disposition: form-data; name=""__EVENTVALIDATION""
    
    /wEWBAKXx6zsBALa1ffGCwK80PHQDQLurOv8AU7Jo8sYj9+E/zw7RsmFraAotTazyvQc7T2VseLqSwGO
    --{0}
    Content-Disposition: form-data; name=""ctl00$MainContent$fname""
    
    jim
    --{0}
    Content-Disposition: form-data; name=""ctl00$MainContent$lname""
    
    bob
    --{0}
    Content-Disposition: form-data; name=""ctl00$MainContent$picUpload""; filename=""C:\temp\small.JPG""
    Content-Type: image/jpeg
    
    ", boundry);
    
            string endData = string.Format(@"
    --{0}
    Content-Disposition: form-data; name=""ctl00$MainContent$post""
    
    
    --{0}--
    ", boundry);
    
    
            List<byte> postByteArray = Encoding.UTF8.GetBytes(postData).ToList();
    
            byte[] file = File.ReadAllBytes(@"C:\temp\small.JPG");
    
            postByteArray.AddRange(file);
    
            postByteArray.AddRange(Encoding.UTF8.GetBytes(endData));
    
            client.Headers.Add("Content-Type", contentType);
    
            client.UploadData("http://localhost:63247/Default.aspx", "POST", postByteArray.ToArray());
        }   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-28
      • 2015-09-27
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多