Используя.NET для Регистрации файла на Сервер HttpWebRequest или WebClient

Хорошо, таким образом, вот соглашение. Как вопрос указывает, я пробую к POST файл к веб-серверу и имею несколько проблем.

Я попытался отправить этот тот же файл на тот же веб-сервер с помощью 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

Я пытаюсь использовать класс.NET как WebClient или HttpWebRequest, чтобы сделать то же самое. Вот образец кода, который я попробовал. С WebClient я получаю 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();  
}
8
задан Myishmael 2 March 2010 в 04:05
поделиться

1 ответ

Во-первых, используйте что-то вроде 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;
10
ответ дан 5 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: