2010-03-02 18 views
8

Tamam, işte anlaşma. Soru olarak, bir dosyayı bir web sunucusuna POST yapmaya çalışıyorum ve birkaç sorun yaşıyorum.Sunucuyu HttpWebRequest veya WebClient'e İletmek için .NET Kullanma

Aynı dosyayı Curl.exe kullanarak aynı web sunucusuna göndermeyi denedim ve sorun yaşamadım. Ben .NET sınıfları ile sorun yaşıyorum neden herhangi bir potansiyel nedenleri işaret edebilir, ancak curl ile kullanılan bayraklar gönderdim.

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 

Ben WebClient'a gibi bir .NET sınıfını kullanmaya çalışıyorum ya HttpWebRequest aynı şeyi yapmak. İşte denediğim kodun bir örneği. WebClient ile 505 HTTP Sürümü Desteklenmeyen bir hata alıyorum ve HttpWebRequest ile 501 Uygulanmadı.

bir WebClient'a ile çalışırken:

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); 
} 

Ve HTTPRequest kullanırken:

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(); 
} 
+1

fark tel üzerinden iki çağrı arasında tam olarak ne olduğunu görmek için bir hata ayıklama http proxy kullan: aşağıdaki satırı bir zorunluluktur. Charles'ı (http://www.charlesproxy.com/) veya Fiddler'ı (http://www.fiddler2.com/fiddler2/) deneyin. –

cevap

10

Birincisi, fiddler gibi bir şey kullanmak ve kıvrılma arasındaki farklılık ne olduğunu görmek için istekleri ve yanıtları incelemek ve System.Net.WebClient. Ayrıca

, (ayıklama proxy ile teftiş farkı kesin olarak belirlemek için izin vermelidir rağmen) deneyebileceğiniz:

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

Set: temel kimlik doğrulaması için kimlik bilgilerinizi ayarlamak için

Kullanım kimlik önbelleği kullanıcı aracısı başlığı:

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

Değişim webrequest protokol sürümü:

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

"WebRequest'teki protokol sürümünü değiştir" hile yaptı! – Myishmael

+0

Benzer sorun: Bir kullanıcı aracı üstbilgisi eklemek benim için düzeltildi. –

1

501 anlaşması olduğunda başka 2 neden daha olabilir.

sonundan ileri bazı Çinli chracter veya başka karakter içermelidir

---------- 1 ---------. , ör. Doğru mesajı göndermek için aşağıdaki 2 satırı da ekleyebilirsiniz;

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

bu da o vesileyle bir 501

için, size 2 satır silebilirsiniz kurşun ve şöyle sonundan ileri değiştirin.

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

belki de bu PostDate'i değiştirmek için bir çözümdür, ancak henüz test etmedim.

Response.StatusCode == HttpStatusCode.Redirect Yönlendirme olan 302'nin eşitse

---------- 2 ---------

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

.

Request.AllowAutoRedirect = false; 
İlgili konular