1

我在.net 中使用WebRequest 类并将数据发布到响应响应的服务器。

奇怪的是,当我开始使用 fiddler 来分析我的网络流量时,它可以工作,但没有 fiddler 就不行。

所以我开始分析使用 WireShark 发送到我的计算机和从我的计算机发送的包。在这个程序中,它很容易遵循 TCP 流。因此,当我打开提琴手时,我可以看到发送了正确的 Request-header/body,并获得了 Response-header/body。奇怪的是,当我不使用提琴手时,请求标头被发送,然后我得到了响应标头/正文,最后是 TCP 流末尾的请求正文。

这是我一直在阐述的代码:

string lcUrl = "http://XX.XX.XXX.XX";

        // *** Establish the request 

        HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl);

        string lcPostData = testdata;

        loHttp.Method = "POST";

        byte [] lbPostBuffer = System.Text.Encoding.GetEncoding(1252).GetBytes(lcPostData);

        loHttp.ContentLength = lbPostBuffer.Length;

        loHttp.Credentials = CredentialCache.DefaultCredentials;

        //loHttp.SendChunked = true;

        loHttp.ServicePoint.Expect100Continue = false;

        Stream loPostData = loHttp.GetRequestStream();

        loPostData.Write(lbPostBuffer, 0, lbPostBuffer.Length);

        loPostData.Close();

        HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse();

        Encoding enc = System.Text.Encoding.GetEncoding(1252);

        StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc);

        string lcHtml = loResponseStream.ReadToEnd();

        loWebResponse.Close();

        loResponseStream.Close();
4

2 回答 2

2

请使用以下代码。似乎您在将基础流发送到远程服务器时遇到了时间问题。

string lcUrl = "http://XX.XX.XXX.XX";
// *** Establish the request 
HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl);
string lcPostData = testdata;
loHttp.Method = "POST";
byte[] lbPostBuffer = System.Text.Encoding.GetEncoding(1252).GetBytes(lcPostData);
loHttp.ContentLength = lbPostBuffer.Length;
loHttp.Credentials = CredentialCache.DefaultCredentials;
//loHttp.SendChunked = true;
loHttp.ServicePoint.Expect100Continue = false;
using (Stream loPostData = loHttp.GetRequestStream())
{
     loPostData.Write(lbPostBuffer, 0, lbPostBuffer.Length);
}
string lcHtml;
using (HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse())
{
    Encoding enc = System.Text.Encoding.GetEncoding(1252);
    using (StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc))
    {
         lcHtml = loResponseStream.ReadToEnd();
    }               
}
// Perform processing of data here....

我还可以建议您在 app.config 文件中为您的应用程序添加以下代码。当服务器返回的响应不符合 .NET 处理 HTTP 请求的方式时,这很有帮助。

<configuration>
 <system.net>
 <settings>
<httpWebRequest
useUnsafeHeaderParsing="true"
/>
</settings>
</system.net>
</configuration>
于 2010-08-10T16:53:16.710 回答
0

我怀疑客户端正在等待来自服务器的“HTTP/1.1 100 continue”响应。这就是它的工作原理。当您将数据发布到服务器时,有时服务器可能还没有准备好接受数据。例如,它想首先对客户端进行身份验证。

因此,当您发送 POST 请求时,客户端只发送请求标头,并附加“Expect: 100-continue”。

POST /url HTTP/1.1 服务器:服务器名称/fqdn 内容长度:100 预期:100-继续

如果服务器准备好接收它响应的数据:

HTTP/1.1 100 继续服务器:server-name/fqdn

现在,客户端可以发送数据了。

但是,如果服务器还没有准备好接收数据,并且想要对客户端进行身份验证,它将以不同的状态码进行响应。

如果您将您的wireshark 跟踪发布到pastebin.com,我可以验证,但我怀疑这是正在发生的事情。

您在 fiddler 中看不到这一点的原因可能是 fiddler 正在使用 HttpListener 侦听 HTTP 请求,而 HTTP 侦听器从应用程序(在本例中为 fiddler)隐藏了中间响应,如 100-continue。

于 2010-08-10T20:15:39.077 回答