2010-03-02 14 views
8

पर फ़ाइल पोस्ट करने के लिए .NET का उपयोग करना ठीक है तो यह सौदा है। जैसा कि सवाल बताता है, मैं एक वेबसर्वर को एक फाइल पोस्ट करने की कोशिश कर रहा हूं और कुछ समस्याएं हैं।सर्वर HttpWebRequest या WebClient

मैंने Curl.exe का उपयोग करके उसी फ़ाइल को उसी वेबसर्वर पर पोस्ट करने का प्रयास किया है और इसमें कोई समस्या नहीं है। मैंने झंडे के साथ उपयोग किए गए झंडे पोस्ट किए हैं, बस वे किसी भी संभावित कारण बता सकते हैं कि मुझे .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 की तरह एक .NET वर्ग का उपयोग करने के कोशिश कर रहा हूँ या HttpWebRequest। मैंने जिस कोड का प्रयास किया है उसका नमूना यहां दिया गया है। वेब क्लाइंट के साथ मुझे 505 HTTP संस्करण समर्थित त्रुटि नहीं मिली है और HttpWebRequest के साथ मुझे 501 लागू नहीं किया गया है।

जब एक 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(); 
} 
+1

देखने के लिए वास्तव में क्या अंतर तार पर दो कॉल के बीच है एक डिबगिंग HTTP प्रॉक्सी का उपयोग करें: निम्न पंक्ति बहुत जरूरी है। चार्ल्स (http://www.charlesproxy.com/) या फिडलर (http://www.fiddler2.com/fiddler2/) आज़माएं। –

उत्तर

10

पहले, Fiddler की तरह कुछ का उपयोग करें और अनुरोध और प्रतिक्रियाओं का निरीक्षण क्या कर्ल के बीच अलग देखने के लिए और 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; 
+0

"WebRequest पर प्रोटोकॉल संस्करण बदलें" चाल है! – Myishmael

+0

इसी तरह की समस्या: उपयोगकर्ता एजेंट शीर्षलेख जोड़ना मेरे लिए इसे ठीक करता है। –

1

501 समझौते के बाद 2 अन्य कारण हो सकते हैं।

---------- 1 ---------

जब postdate कुछ चीनी Chracter या कुछ अन्य चरित्र होते हैं। उदा।

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+" 

शायद यह पोस्टडेट को संशोधित करने का एक समाधान है, हालांकि मैंने अभी तक परीक्षण नहीं किया है।

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

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

अगर Response.StatusCode == HttpStatusCode.Redirect पुनर्निर्देशन है 302 के बराबर है।

Request.AllowAutoRedirect = false;