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

Myi*_*ael 8 .net c# post webrequest httpwebresponse

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

我尝试使用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
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用像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);
}
Run Code Online (Sandbox Code Playgroud)

在使用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();  
}
Run Code Online (Sandbox Code Playgroud)

dug*_*gas 10

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

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

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

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

设置用户代理标头:

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

更改WebRequest上的协议版本:

reqeust.KeepAlive = false;
request.ProtocolVersion=HttpVersion.Version10;
Run Code Online (Sandbox Code Playgroud)