WP7 HttpWebRequest POST, сервер возвращает «{result: 'ok'} \» в эмуляторе, но «error: NotFound» на устройстве - PullRequest
2 голосов
/ 06 июля 2011

Я пытаюсь выполнить базовый http POST для веб-службы из моего приложения для Windows Phone 7. Я знаю, что веб-сервис работает нормально, потому что я использую его для трех других мобильных платформ.

Я изменил пример C # с http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetrequeststream.aspx

    string boundary = DateTime.Now.Ticks.ToString();
    private void POST_TEST(object sender, RoutedEventArgs e)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Constants.JSON_URL_PREFIX + Settings.Settings.DeviceID + "/inquiry/new/");
        request.ContentType = "multipart/form-data; boundary=" + boundary;
        request.Method = "POST";

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

    public void GetRequestStreamCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

        Stream postStream = request.EndGetRequestStream(asynchronousResult);

        StringBuilder postData = new StringBuilder();
        postData.Append("--" + boundary + "\r\n");
        postData.Append("Content-Disposition: form-data; name=\"body\"\r\n\r\n");
        postData.Append("test 123");
        postData.Append("\r\n--" + boundary + "\r\n");

        byte[] byteArray = Encoding.UTF8.GetBytes(postData.ToString());

        postStream.Write(byteArray, 0, postData.Length);
        postStream.Close();

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

    private static void GetResponseCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

        // End the operation
        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
        Stream streamResponse = response.GetResponseStream();
        StreamReader streamRead = new StreamReader(streamResponse);
        string responseString = streamRead.ReadToEnd();
        // Close the stream object
        streamResponse.Close();
        streamRead.Close();

        // Release the HttpWebResponse
        response.Close();
    }

Я получаю "{result: 'ok'}" с сервера, когда я запускаю это в эмуляторе, но "error: NotFound", когда я запускаю его на своем Samsung Focus. Я предполагаю, что это связано с тем, как строка преобразуется в байт [] в телефоне по сравнению с настольным компьютером.

Есть идеи по исправлению? Может быть, это известная ошибка, с которой я никогда не сталкивался при поиске ответа в Интернете?

Ответы [ 2 ]

2 голосов
/ 06 июля 2011

Я наконец-то понял, что уникальный идентификатор / идентификатор устройства моего телефона содержит косую черту. Это вызвало проблему, когда я создал веб-сервис Uri по адресу:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Constants.JSON_URL_PREFIX + Settings.Settings.DeviceID + "/inquiry/new/");

Пример эмулятора Uri: http://www.blah.com/abc_123=/inquiry/new/
Пример устройства Uri: http://www.blah.com/abc/123=/inquiry/new/

Очевидно, что в эмуляторе он работал нормально, потому что в идентификаторе устройства эмулятора нет косой черты. По сути, Uri, на который я пытался отправить сообщение, был неверным.

Вид неясной ошибки ...

Спасибо, Опена и Мэтт. Ваши предложения помогли мне кое-что попробовать и в итоге помогли мне увидеть проблему.

0 голосов
/ 06 июля 2011

Я использую это решение в приложении, но мои postData выглядят как postData.Append("test=123").Я не использую границы (я думал, что границы были только для почты?)Также мой запрос. Тип контента request.ContentType = "application/x-www-form-urlencoded";

...