0

我有一个 WP7 应用程序,我正在尝试重建一个 HTTPWebRequest,我已使用同步方法(最后粘贴)在其他地方成功编写但它在 WP7 中不起作用,我认为是因为我做错了异步这些方法的版本。

我相信这个问题源于 Compact Framework 上的非工作代码只能发送一个 bytearray[] - 我没有发送 json 字符串的选项。如果我在有效的代码中发送一个字节数组,我也会在那里得到一个错误。有不同的选择吗?

这是我的代码 - 这不起作用。在最后一个方法的第 2 行抛出异常 - “Using(var respons ...)”:

public void CreateUser()
    {
        var request = (HttpWebRequest)WebRequest.Create("http://staging.cloudapp.net:8080/api/users/");
        request.Method = "POST";
        request.ContentType = "text/json; charset=utf-8";
        request.BeginGetRequestStream(new AsyncCallback(RequestCallback), request);
    }

    private static void RequestCallback(IAsyncResult result)
    {
        HttpWebRequest request = (HttpWebRequest)result.AsyncState;

        using (Stream postStream = request.EndGetRequestStream(result))
        {
            User user = new User("Windows", "Phone", "USCA");

            Formatting formatting = new Formatting();
            JsonSerializerSettings settings = new JsonSerializerSettings();
            settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            string json = JsonConvert.SerializeObject(user, formatting, settings);

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

            postStream.Write(byteArray, 0, json.Length);
        }

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

    private static void ResponseCallback(IAsyncResult result)
    {
        var request = (HttpWebRequest)result.AsyncState;
        using (var response = (HttpWebResponse)request.EndGetResponse(result))
        {

            using (Stream streamResponse = response.GetResponseStream())
            {
                StreamReader reader = new StreamReader(streamResponse);
                string responseString = reader.ReadToEnd();
                reader.Close();
            }
        }
    }

此代码有效(同一请求的非紧凑框架版本):

HttpWebRequest request = HttpWebRequest.Create("http://staging.cloudapp.net/api/users/") as HttpWebRequest;
        request.Method = "POST";
        request.ContentType = "text/json";
        using (var writer = new StreamWriter(request.GetRequestStream()))
        {
            User user = new user("Other", "Guy", "USWC");
            Formatting formatting = new Formatting();
            JsonSerializerSettings settings = new JsonSerializerSettings();
            settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            string json = JsonConvert.SerializeObject(user, formatting, settings);

            writer.Write(json);
        }

        var response = request.GetResponse() as HttpWebResponse;
        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            var responseText = reader.ReadToEnd();
            return responseText;
        }

谢谢你的帮助!

4

3 回答 3

1

看起来服务器正在响应“404 not found”。您请求的资源是否存在于服务器上?

于 2012-08-11T05:28:59.617 回答
1

您的 JSON 是否包含任何非 7 位 ASCII 字符,就像您目前正在做的那样:

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

postStream.Write(byteArray, 0, json.Length);

字节数可能与字符串中的字符数不同,这可能会导致请求格式错误。

值得使用 Fiddler 之类的东西来验证从模拟器或电话中实际传输的内容(Fiddler 网站上有关于如何执行此操作的说明)

于 2012-08-15T11:38:08.520 回答
0

好吧 - 我不确定为什么这个问题消失了。我喜欢@RowlandShaw 的建议,但我实际上并没有更改 json 中的任何内容。希望我能给出更好的解决方案。

于 2012-09-01T23:13:02.583 回答