webForumDet fria alternativet

upload med HttpWebRequest

.NETur .NET

5 svar · 283 visningar · startad av peterbladh

Medlem sedan juni 2000277 inlägg
Frågan#1

Hej

Jag skulle vilja göra samma sak som WebClient Upload gör fast med HttpWebRequest. Detta för att koden skall vara compact framework kompatibel.

WebClient Kod

WebClient client = new WebClient();
client.UploadFile(Url, "POST", FileToUpload);

HttpWebRequest kod

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Url);
req.Timeout = 10000; 
req.Method = "POST";
req.KeepAlive= false;
FileInfo finfo = new FileInfo(FileToUpload);
FileStream fs = File.Open(FileToUpload, FileMode.Open);
byte [] data = new byte[fs.Length];
req.ContentLength = finfo.Length;
fs.Read(data, 0, (int)fs.Length);
Stream stream = req.GetRequestStream();
stream.Write(data, 0, data.Length);
stream.Close();
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
Console.WriteLine(res.ToString());
res.Close();

WebClient funkar. HttpWebRequest ger mig 500 Internal Error.

Vet nån vad som är fel?

Tack på förhand!

Medlem sedan juni 20022 599 inlägg
#2

Jag körde båda koderna med en sniffer påslagen och den första uppförde sig som en webbläsare och skickade snyggt och prydligt alla headers:

POST / HTTP/1.1.

Content-Length: 24895
Host: hplinux

Content-Disposition: form-data; 
name="file"; 
filename="fil.zip"
Content-Type: application/octet-stream

Den andra koden skickade bara Content-Length och sen direkt all binärdata. Om du vill att webbsidan ska ha en rimlig chans att tolka det så gissar jag att du måste sköta allt sånt manuellt:

req.ContentType = ..
rec.headers.add( ..
' osv ..

Kolla de metoder som finns under HttpWebRequest (eller försök hitta bättre kod).

Medlem sedan juni 2000277 inlägg
#3

Hej

Nu har jag labbat en hel del med olika headers, men tyvärr utan att lyckas.

Är det någon som har gjort detta och har lite fungerande kod att visa mig?

Medlem sedan juni 20022 599 inlägg
#4

Svårt att svara när man inte vet vad som finns på "andra sidan" och tar emot filen.

Men nåt sånt här borde det bli (om den första funkar):

// ..
req.KeepAlive= false;
FileInfo finfo = new FileInfo(FileToUpload);
req.ContentType="application/octet-stream";
req.Headers.Add("Content-Disposition: form-data; name=\"file\"; filename=\"" + finfo.Name + "\"");
// ..

Du kan också prova med KeepAlive= true.

Medlem sedan juni 2000277 inlägg
#5

Nix
Det funkar fortfarande inte.

Servern är en asp-sida med SAFileUp (nu när jag labbar);

<%
Set upl = Server.CreateObject("Softartisans.FileUp")
upl.Path = "D:\temp\"
upl.Save
%>

Medlem sedan juni 20022 599 inlägg
#6

Kan tyvärr inte svara. Om nu den första koden verkligen funkar så är mitt tips att du laddar ner valfri paketövervakare så att du ser skillnaderna i det de olika koderna skickar. När du fått dem exakt lika så måste det ju funka.

OBS: När du testar så måste du skicka mot en extern IP (inte lokal).

133 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)