3

我有一个使用以下代码执行 HTTP 发布的 C# 控制台应用程序(.NET 2.0 框架):

StringBuilder postData = new StringBuilder(100);
postData.Append("post.php?");
postData.Append("Key1=");
postData.Append(val1);
postData.Append("&Key2=");
postData.Append(val2);

byte[] dataArray = Encoding.UTF8.GetBytes(postData.ToString());

HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create("http://example.com/");
httpRequest.Method = "POST";
httpRequest.ContentType = "application/x-www-form-urlencoded";

httpRequest.ContentLength = dataArray.Length;
Stream requestStream = httpRequest.GetRequestStream();
requestStream.Write(dataArray, 0, dataArray.Length);
requestStream.Flush();
requestStream.Close();

HttpWebResponse webResponse = (HttpWebResponse)httpRequest.GetResponse();

if (httpRequest.HaveResponse == true) {
  Stream responseStream = webResponse.GetResponseStream();
  StreamReader responseReader = new System.IO.StreamReader(responseStream, Encoding.UTF8);
  String responseString = responseReader.ReadToEnd();
}

其输出为:
webResponse.ContentLength = -1
webResponse.ContentType = text/html
webResponse.ContentEncoding 为空白

responseString 是带有标题和正文的 HTML。

但是,如果我将相同的 URL 发布到浏览器 ( http://example.com/post.php?Key1=some_value&Key2=some_other_value ),我会得到一个小的 XML 片段,例如:

<?xml version="1.0" ?>
<RESPONSE RESULT="SUCCESS"/>

没有与应用程序中相同的 HTML。为什么反应如此不同?我需要解析在 HTML 中没有得到的返回结果。我是否必须更改我在应用程序中发布帖子的方式?我无法控制接受帖子的服务器端代码。

4

7 回答 7

9

如果您确实应该使用POSTHTTP 方法,那么您有几个问题。首先,这一行:

postData.Append("post.php?");

是不正确的。您想发布 post.php,不想发布值“post.php?” 到页面。只需完全删除此行。

这件作品:

... WebRequest.Create("http://example.com/");

需要post.php添加它,所以...

... WebRequest.Create("http://example.com/post.php");

同样,这是假设您实际上应该是POSTing 到指定的页面而不是GETing。如果您应该使用GET,那么已经提供的其他答案适用。

于 2009-02-13T02:32:58.137 回答
3

你会想要一个像Fiddler这样的 HTTP 嗅探器工具,并将你的应用程序发送的标题与浏览器发送的标题进行比较。会有一些不同的东西导致服务器返回不同的响应。当您调整应用程序以发送浏览器发送的相同内容时,您应该得到相同的响应。(它可以是用户代理、cookie 等任何东西,但肯定会有所不同。)

于 2009-02-13T21:00:58.643 回答
2

我过去见过这种情况。

当您从浏览器运行时,标题中的“User-Agent”是“Mozilla ...”。

当您从程序运行时,它会有所不同,并且通常特定于所使用的语言。

于 2009-02-13T01:59:03.723 回答
1

我认为您需要使用 GET 请求,而不是 POST。如果您使用的 url 具有查询字符串值(如 ?Key1=some_value&Key2=some_other_value),那么它需要一个 GET。无需将 post 值添加到您的 webrequest 中,只需将此数据放在查询字符串中即可。

HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create("http://example.com/?val1=" + val1 + "&val2=" + val2);
httpRequest.Method = "GET";
httpRequest.ContentType = "application/x-www-form-urlencoded";
....

因此,当您从应用程序发布数据时,您得到的结果会有所不同,因为服务器端代码在无法读取查询字符串中预期的数据时会产生不同的输出。

于 2009-02-13T02:27:37.820 回答
1

在您的代码中,您指定将数据发送到 PHP 文件而不将数据放入 Web 地址的 POST 方法。当你把信息放在地址栏中时,那不是POST方法,那是GET方法。这个名字可能会让人混淆,但 GET 只是意味着数据正在通过 Web 地址发送到 PHP 文件,而不是在幕后,而不是它应该获取任何信息。当您将地址放入浏览器时,它使用的是 GET。

创建一个简单的 html 表单并将 POST 指定为方法,将您的 url 指定为操作。您将看到发送的信息没有出现在地址栏中。

然后做同样的事情,但指定 GET。您将在地址栏中看到您发送的信息。

于 2009-02-13T01:53:12.350 回答
0

表单是否需要 cookie?这是它在浏览器中运行而不是在控制台应用程序中运行的另一个可能原因。

于 2009-02-13T02:58:44.033 回答
0

我相信这个问题与为 WebRequest 设置标头的方式有关。

我见过一些奇怪的情况,尝试通过更改请求中的标头来模拟浏览器会对服务器产生影响。

简短的回答是您的控制台应用程序不是 Web 浏览器,example.com 的 Web 服务器期望与浏览器交互。

您也可以考虑将 ContentType 更改为“multipart/form-data”。

我觉得奇怪的是,你基本上什么也没发。这项工作是由查询字符串完成的。因此,您可能应该使用 GET 而不是 POST。

于 2009-02-13T01:51:31.323 回答