簡體   English   中英

使用.NET將文件發布到服務器HttpWebRequest或WebClient

[英]Using .NET to Post a file to Server HttpWebRequest or 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之間的區別。

此外,您可以嘗試(盡管使用調試代理檢查應該允許您查明差異):

使用憑據緩存設置基本身份驗證的憑據:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM