使用.NET将文件发布到服务器HttpWebRequest或WebClient

好的,这是交易。 正如问题所述,我正在尝试将文件发布到网络服务器并且遇到一些问题。

我尝试使用Curl.exe将同一个文件发布到同一个Web服务器,并且没有任何问题。 我已经发布了我用curl的标志,因为他们可能会指出我遇到.NET类问题的任何潜在原因。

curl.exe --user "myUser:myPass" --header "Content-Type: application/gzip" --data-binary "@filename.txt.gz" --cookie "data=service; data-ver=2; date=20100212; time=0900; location=1234" --output "out.txt" --dump-header "header.txt" http://mysite/receive 

我正在尝试使用像WebClient或HttpWebRequest这样的.NET类来做同样的事情。 这是我尝试过的代码示例。 使用WebClient,我得到505 HTTP版本不支持错误,并且使用HttpWebRequest我得到501 Not Implemented。

使用WebClient进行尝试时:

 public void sendFileClient(string path){ string url = "http://mysite/receive"; WebClient wc = new WebClient(); string USERNAME = "myUser"; string PSSWD = "myPass"; NetworkCredential creds = new NetworkCredential(USERNAME, PSSWD); wc.Credentials = creds; wc.Headers.Set(HttpRequestHeader.ContentType, "application/gzip"); wc.Headers.Set("Cookie", "location=1234; date=20100226; time=1630; data=service; data-ver=2"); wc.UploadFile(url, "POST", path); } 

在使用HttpRequest时:

 public Stream sendFile(string path) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://myserver/receive"); string USERNAME = "myUser"; string PSSWD = "myPass"; NetworkCredential creds = new NetworkCredential(USERNAME, PSSWD); request.Credentials = creds; request.Method = "POST"; request.ContentType = "application/gzip"; request.Headers.Set("Cookie", "location=1234; date=20100226; time=1630; data=service; data-ver=2"); FileInfo fInfo = new FileInfo(path); long numBytes = fInfo.Length; FileStream fStream = new FileStream(path, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fStream); byte[] data = br.ReadBytes((int)numBytes); br.Close(); fStream.Close(); fStream.Dispose(); Stream wrStream = request.GetRequestStream(); BinaryWriter bw = new BinaryWriter(wrStream); bw.Write(data); bw.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); return response.GetResponseStream(); } 

首先,使用类似fiddler的东西并检查请求和响应,以查看curl和System.Net.WebClient之间的区别。

此外,您可以尝试(尽管使用调试代理检查应该允许您查明差异):

使用凭据缓存设置基本身份validation的凭据:

 var cc= new CredentialCache(); cc.Add(new Uri(url), "Basic", new NetworkCredential("USERNAME", "PASSWORD")); wc.Credentials = cc; 

设置用户代理标头:

 string _UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"; wc.Headers.Add(HttpRequestHeader.UserAgent, _UserAgent); 

更改WebRequest上的协议版本:

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

501协议可能还有另外两个原因。

———- ——— 1

当postdate包含一些中国字符或其他一些字符时。 例如

 postDate = "type=user&username=计算机学院&password=123&Submit=+登录+" 

为了发布正确的消息,您还可以添加以下2行;

 Request.SendChunked = true; Request.TransferEncoding = "GB2312"; 

这也导致501。

在那种情况下,你可以删除2行,并像这样修改postDate。

 postDate = "type=user&username=%BC%C6%CB%E3%BB%FA%D1%A7%D4%BA&password=123&Submit=+%C8%B7%C8%CF+" 

也许这是修改postDate的解决方案,但是我还没有测试过。

 string str = Encoding.GetEncoding("gb2312").GetString(tmpBytes); 

———- ——— 2

如果Response.StatusCode == HttpStatusCode.Redirect Redirect等于302.以下行是必须的:

 Request.AllowAutoRedirect = false;