2 Stimmen

POST Anfragen auf WP7

Ich habe ungefähr 6 Stunden damit verbracht, herauszufinden, wie man eine normale POST-Anfrage in WP7 macht, ich habe die Antworten auf ähnliche Fragen hier und an vielen anderen Orten ausprobiert, ich habe auch viele verschiedene APIs POST-Anfragen ausprobiert, sie alle führen zu einem bestimmten Problem,

Der entfernte Server hat einen Fehler zurückgegeben: Nicht gefunden.

Es scheint, als fehlt jedes Mal etwas.

Also, wenn Sie bitte jemandem uns zeigen könnten, wie man eine POST-Anfrage in diesem WP7 richtig macht

5voto

calum Punkte 1580

Ich benutze dies, um problemlos auf Facebook zu posten:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUrl);
request.Method = "POST";
request.BeginGetResponse((e) =>
{
    try
    {
        WebResponse response = request.EndGetResponse(e);
        // Do Stuff
    }
    catch (WebException ex)
    {
        // Handle
    }
    catch (Exception ex)
    {
        // Handle
    }
}, null);

Ich gehe davon aus, dass du dies bereits versucht hast, daher könnte es etwas mit den Post-Daten zu tun haben (die im obigen Beispiel nicht enthalten sind, da Facebook die Abfragezeichenfolge verwendet). Kannst du uns weitere Informationen geben?

BEARBEITEN: Dies ist ein (nicht getestetes) Beispiel zum Schreiben von Post-Daten:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUrl);
request.Method = "POST";
request.BeginGetRequestStream((e) =>
{
    using (Stream stream = request.EndGetRequestStream(e))
    {
        // Daten in den Anfragestrom schreiben
    }
    request.BeginGetResponse((callback) =>
    {
        try
        {
            WebResponse response = request.EndGetResponse(callback);
            // Do Stuff
        }
        catch (WebException ex)
        {
            // Handle
        }
        catch (Exception ex)
        {
            // Handle
        }
    }, null);
}, null);

2voto

Pieter Nijs Punkte 425

Ich verwende die folgende Klasse für das Erstellen von POST-Anfragen mit WP7:

public class PostMultiPartFormData
{
    private Dictionary Parameters;
    private Encoding ENCODING = Encoding.UTF8;
    private string BOUNDARY = "-----------------------------wp7postrequest";
    public event EventHandler PostComplete;

    public void Post(string postbackURL,
        Dictionary parameters)
    {
        Parameters = parameters;

        Uri url = null;
        url = new Uri(postbackURL);

        HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
        request.Method = "POST";

        request.ContentType = "multipart/form-data; boundary=" + BOUNDARY;
        request.BeginGetRequestStream(new AsyncCallback(SendStatusUpdate), request);
    }

    private void SendStatusUpdate(IAsyncResult ar)
    {
        HttpWebRequest request = (HttpWebRequest)ar.AsyncState;
        Stream stream = request.EndGetRequestStream(ar);

        byte[] byteArray = GetMultipartFormData(Parameters, BOUNDARY);

        stream.Write(byteArray, 0, byteArray.Length);
        stream.Close();
        stream.Dispose();

        request.BeginGetResponse(new AsyncCallback(StatusUpdateCompleted), request);
    }

    private byte[] GetMultipartFormData(Dictionary postParameters, string boundary)
    {
        Stream formDataStream = new System.IO.MemoryStream();
        foreach (var param in postParameters)
        {
            if (param.Value is byte[])
            {
                byte[] fileData = param.Value as byte[];

                string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}.jpg\";\r\nContent-Type: application/octet-stream\r\n\r\n", boundary, param.Key, param.Key);

                formDataStream.Write(ENCODING.GetBytes(header), 0, header.Length);

                formDataStream.Write(fileData, 0, fileData.Length);
            }
            else
            {
                string postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}\r\n", boundary, param.Key, param.Value);
                byte[] b = ENCODING.GetBytes(postData);
                foreach (var item in b)
                {
                    formDataStream.WriteByte(item);
                }
            }
        }

        string footer = "\r\n--" + boundary + "--\r\n";
        byte[] footerbytes = ENCODING.GetBytes(footer);
        formDataStream.Write(footerbytes, 0, footerbytes.Length);

        formDataStream.Position = 0;
        byte[] formData = new byte[formDataStream.Length];
        formDataStream.Read(formData, 0, formData.Length);
        formDataStream.Flush();
        formDataStream.Close();
        return formData;
    }

    private void StatusUpdateCompleted(IAsyncResult ar)
    {
        if (PostComplete != null)
        {
            PostComplete(ar, null);
        }
    }
}

Beispiel:

PostMultiPartFormData postRequest = new PostMultiPartFormData();

        postRequest.PostComplete += new EventHandler( (sender, e) => 
        {
            IAsyncResult ar = ((IAsyncResult)sender);

            using (WebResponse resp = ((HttpWebRequest)ar.AsyncState).EndGetResponse(ar))
            {

                using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
                {

                    string responseString = sr.ReadToEnd();

                    this.Dispatcher.BeginInvoke(() =>
                    {
                        textBlock.Text = responseString;
                    });
                }
            }
        });

        postRequest.Post("http://localhost:50624/SSLProxy.ashx", 
            new Dictionary() { { "param1", "value1" } });

Dies sollte funktionieren... Wenn nicht, lass es mich wissen! :-)

1voto

Rico Suter Punkte 11145

Für einen einfacheren Zugriff auf erweiterte http-Funktionen werfen Sie einen Blick auf diese http-Klassen:

http://mytoolkit.codeplex.com/wikipage?title=Http

Es umfasst GET, POST, FILES (unter Verwendung von Pfad oder Stream-Objekten) und GZIP (nicht direkt von WP7 unterstützt) Anfragen.

0voto

Ku6opr Punkte 8161

Um Post-Daten hinzuzufügen, rufen Sie einfach die Methode BeginGetRequestStream auf (auch BeginGetResponse wird zu GetRequestStreamCallback verschoben)

request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);

void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
    HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
    // Beenden Sie den Stream-Anforderungsvorgang
    Stream postStream = webRequest.EndGetRequestStream(asynchronousResult);

    // Erstellen Sie die Post-Daten
    string postData = "Post-Daten";
    byte[] byteArray = Encoding.Unicode.GetBytes(postData);

    // Fügen Sie die Post-Daten der Web-Anforderung hinzu            
    postStream.Write(byteArray, 0, byteArray.Length);
    postStream.Close();

    // Starten Sie die Web-Anfrage
    webRequest.BeginGetResponse(new AsyncCallback(GetResponseCallback), webRequest);
}

0voto

Sorokin Andrey Punkte 419

Ich empfehle Ihnen, den postclient zu verwenden. Es ist ziemlich einfach. Sie müssen nur eine Verweis auf die DLL-Datei in Ihr Projekt hinzufügen und dann etwas wie folgt schreiben:

public void authorize(string login, string password)
{
    Dictionary parameters = new Dictionary();
    parameters.Add("command", "login");
    parameters.Add("username", login);
    parameters.Add("password", password);

    PostClient proxy = new PostClient(parameters);
    proxy.DownloadStringCompleted += (sender, e) =>
    {
        if (e.Error == null)
        {
            MessageBox.Show(e.Result);
        }
    };
    proxy.DownloadStringAsync(new Uri("http://address.com/service", UriKind.Absolute));
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X