Загрузка формы C# HttpWebRequestC#

Место общения программистов C#
Anonymous
Загрузка формы C# HttpWebRequest

Сообщение Anonymous »

Я пытаюсь автоматизировать загрузку файлов из моей программы на C#. Это метод загрузки файла.

Код: Выделить всё

public static string UploadFileEx(string uploadfile, string url,
string fileFormName, string contenttype, NameValueCollection querystring,
CookieContainer cookies)
{
if ((fileFormName == null) ||
(fileFormName.Length == 0))
{
fileFormName = "file";
}

if ((contenttype == null) ||
(contenttype.Length == 0))
{
contenttype = "application/octet-stream";
}

string postdata;
postdata = "";
if (querystring != null)
{
foreach (string key in querystring.Keys)
{
postdata += key + "=" + querystring.Get(key) + "&";
}
}
Uri uri = new Uri(url + postdata);

string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);

var sp = webrequest.ServicePoint;
var prop = sp.GetType().GetProperty("HttpBehaviour", BindingFlags.Instance | BindingFlags.NonPublic);
prop.SetValue(sp, (byte)0, null);

webrequest.CookieContainer = cookies;
webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
webrequest.Method = "POST";

webrequest.KeepAlive = true;
webrequest.Referer = "http://www.iwi.hs-karlsruhe.de/scs/simulate/upload.jsp";
webrequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
webrequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1";
webrequest.Headers.Add("Accept-Language:de-de,de;q=0.8,en-us;q=0.5,en;q=0.3");
webrequest.Headers.Add("Accept-Encoding:gzip, deflate");
webrequest.ProtocolVersion = HttpVersion.Version11;

// Build up the post message header

StringBuilder sb = new StringBuilder();
sb.Append("--");
sb.Append(boundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"");
sb.Append(fileFormName);
sb.Append("\";  filename=\"");
sb.Append(Path.GetFileName(uploadfile));
sb.Append("\"");
sb.Append("\r\n");
sb.Append("Content-Type: ");
sb.Append(contenttype);
sb.Append("\r\n");
sb.Append("\r\n");

string postHeader = sb.ToString();
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);

// Build the trailing boundary string as a byte array

// ensuring the boundary appears on a line by itself

byte[] boundaryBytes =
Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");

FileStream fileStream = new FileStream(uploadfile,
FileMode.Open, FileAccess.Read);
long length = postHeaderBytes.Length + fileStream.Length +
boundaryBytes.Length;
webrequest.ContentLength = length;

Stream requestStream = webrequest.GetRequestStream();

// Write out our post header

requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);

// Write out the file contents

byte[] buffer = new Byte[checked((uint)Math.Min(4096,
(int)fileStream.Length))];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
requestStream.Write(buffer, 0, bytesRead);

// Write out the trailing boundary

requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
try
{
WebResponse responce = webrequest.GetResponse();
Stream s = responce.GetResponseStream();
StreamReader sr = new StreamReader(s);

return sr.ReadToEnd();
}
catch (Exception ex)
{
return ex.Message;
}

}
Когда я вызываю это вот так на странице загрузки образца изображения, все работает нормально:

Код: Выделить всё

string outdata = UploadFileEx(uploadfile,
"http://www.minpic.de/upload_file.php", "uploadfile0", "image/jpg",
null, null);
Но когда я пытаюсь загрузить его на страницу своей средней школы, это не работает. Страница загрузки защищена формой входа. Итак, я вызываю страницу загрузки, чтобы получить файл cookie initail, публикую учетные данные для входа и получаю правильный результат. Итак, я вижу следующую форму загрузки:

Код: Выделить всё

Choose your inputdata file (xml).



Когда я затем публикую изображение (я знаю, что ожидаемый тип — xml, но страница отвечает на ошибку, что я хочу в этом случае...) моя функция загрузки возвращает код ошибки 500. Вот что говорит Wireshark для сообщения браузера:


POST /scs/simulate HTTP/1.1
Хост: некоторый хост
Соединение: Keep-alive
Длина содержимого: 3874
Управление кэшем: max-age=0
Происхождение: тот же хост
Пользовательский агент: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, например Gecko) Chrome/22.0.1229.79 Safari/537.4
Тип контента: multipart/form-data; border=----WebKitFormBoundaryP3Ti6rxYcN1ov7JD
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Referer: некоторый URL
Accept-Encoding: gzip,deflate,sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: SCS_COOKIE=Default=DE$$MarkePlaceLang=DE; JSESSIONID=B459541362241F66D9312AF157262D25


и вот сообщение из C#:


POST то же, что и выше
Content-Type: multipart/form-data; border=----------8cf828671b8365c
Реферер: некоторый URL
Принять: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Пользовательский агент: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, как Gecko) Chrome/13.0.782.220 Safari/535.1
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Хост: тот же хост, что и выше
Cookie: JSESSIONID=FFE0B7530FFE6A3C8F15FD8A900865B0
Content-Length: 3847
Ожидание: 100-continue
Соединение: Keep-Alive


Единственная разница, которую я вижу, это Expect: 100-continue... Есть ли проблема с размером пакета или что-то в этом роде?

Заранее спасибо.

Вернуться в «C#»