Toon posts:

[C#] Windows Mobile HttpWebRequest

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een applicatie voor het Windows Mobile Platform. Ik zit echter met een probleem. Ik moet namelijk een Jpeg naar een webserver (PHP). Hier kom ik echter niet uit. Zodra ik een HttpWebRequest aanmaakt die connectie maakt via de POST methode krijg ik geen resultaat. Een GET HttpWebRequest is geen probleem. Dit krijg ik namelijk wel voor elkaar. In de log op de webserver zie ik dan ook dat ik een GET request uitvoer. Maar zodra ik een POST request uitvoer, waarbij ik geen foutmelding krijg op mijn HTC, komt er niks in de log.
Ik heb echter op verschillende forums gezocht en de onderstaande code zou echt moeten werken. Misschien dat het toch aan de webserver ligt in plaats van de applicatie.

Dit is de code die ik heb gebruikt voor het verzenden van het POST HttpWebRequest.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public string uploadImage(string image)
{           
            Uri uri = new Uri("http://pieter.mybit.nl/uploader.php");
            string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
            HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);
            webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
            webrequest.Method = "POST";
            MessageBox.Show("Webrequest aangemaakt");
            StringBuilder sb = new StringBuilder();
            sb.Append("--");
            sb.Append(boundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=\"");
            sb.Append("uploadfile");
            sb.Append("\"; filename=\"");
            sb.Append(Path.GetFileName(image));
            sb.Append("\"");
            sb.Append("\r\n");
            sb.Append("Content-Type: ");
            sb.Append("image/pjpeg");
            sb.Append("\r\n");
            sb.Append("\r\n");

            string postHeader = sb.ToString();
            byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);
            MessageBox.Show("Header aangemaakt!");
            // 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(image,
                                        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);
            MessageBox.Show("Header naar de server vestuurd");
            // Write out the file contents
            Thread.Sleep(1000);
            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);
            MessageBox.Show("File naar de server verstuurd");
            // Write out the trailing boundary
            Thread.Sleep(1000);
            requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
            MessageBox.Show("Boundary einde gestuurd naar de server");
            WebResponse responce = webrequest.GetResponse();
            Stream s = responce.GetResponseStream();
            StreamReader sr = new StreamReader(s);
            MessageBox.Show("Respons van server gekregen");
            return sr.ReadToEnd();
}


In deze code heb ik een aantal Messageboxes gezet als debug. Ik kom tot en met de MessageBox met de melding "File naar server verstuurd". Echter kan ik dit niet terug vinden in de accesslog van de webserver.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Heb je al met een network sniffer gekeken of er wel wat over de lijn gaat?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • bastv
  • Registratie: September 2005
  • Laatst online: 25-09 12:42
ik gebruik meestal de webclient.
http://www.csharpfriends....rticle.aspx?articleID=115

misschien heb je hier ook nog wat aan.
http://www.daveamenta.com/2008-05/c-webclient-usage/

[ Voor 13% gewijzigd door bastv op 21-11-2008 14:41 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
De WebClient is niet aanwezig in het Compact FrameWork, maar die gebruikt intern ook gewoon HttpWebRequest, dus dat zou geen probleem moeten zijn.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • bloodyairtimer
  • Registratie: Januari 2004
  • Niet online
Ik heb laatst ook zo'n probleempje gehad (overigens geen Mobile applicatie)

Ik heb toen een sniffer gebruikt ( HTTP Debugger Pro ) en de request nagebouwd in code.
Bij een vergelijking van hetgene wat ik in code genereerde, was het verschil dat in de laatste boundary er twee -- bij of af moesten (Ik weet het niet meer zo uit mijn hoofd.)

Het vergelijken van de requests is heel belangrijk.

Ik zie ook niet dat je de inhoud van de file in de header zet, volgens mij gebeurd dat (iig bij een text file) wel.

Succes!

Verwijderd

Topicstarter
Ik heb het probleem opgelost. Allereerst heb ik een gewone c# desktop applicatie gemaakt en hier de header in nagebouwd met behulp van de HTTPDebugger Pro (bedankt voor de tip bloodyairtimer). Vervolgens heb ik deze header in mijn WM6 applicatie gemaakt.
Er waren echter steeds problemen met de verbinding met de webserver (die ik bij de desktop applicatie niet had). Na veel uitzoek werk kwam ik er achter dat dit ligt aan de Except100Continue property van het webrequest.
Meer info van MS hier:
http://msdn.microsoft.com...ct100continue(VS.71).aspx

Bij de desktop applicatie kan je dit oplossen door de volgende regel toe te voegen aan je webrequest:
webrequest.ServicePoint.Expect100Continue = false;
Dit werkt echter niet in het compact framework. Hierdoor kwam de communicatie met onze webserver (LightHttpd) niet tot stand. De waarde van deze property staat namelijk altijd op true in het compact framework (en volgens mij bij het normale .Net framework ook).
Na lang googlen kwam ik uit eindelijk een blog tegen waarvan de auteur met hetzelfde probleem te maken had. Hij kwam ook met de oplossing voor dit probleem.
In de constructor van je programma kan je de volgende regel toevoegen:
ServicePointManager.Expect100Continue = false;
Dit heeft mijn probleem opgelost.
Pagina: 1