2012-08-11 42 views
0

我有一个WP7应用程序,我试图重建一个HTTPWebRequest,我已经使用同步方法在其他地方成功写入(粘贴结束),但在WP7中无法正常工作,我假设因为我对这些方法的异步版本做了错误的处理。HttpWebRequest失败,找不到为什么

我认为这个问题源于Compact Framework上的非工作代码只能发送bytearray []的事实 - 我没有发送json字符串的选项。如果我在可以工作的代码中发送一个bytearray,那么我也会遇到一个错误。有不同的选择吗?

这是我的代码 - 这是行不通的。该异常被抛出的最后一个方法的第2行 - “使用(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(); 
      } 
     } 
    } 

此代码(同样要求的非Compact Framework的版本):

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; 
     } 

感谢您的任何帮助!

+0

你看到的异常类型是什么? – 2012-08-13 12:18:17

+0

这是一个System.Net.WebException - “远程服务器返回错误:未找到。”不是很有帮助。但事实上,我可以将这段代码运行在其他地方,并且在相同的API上运行它,并且如果我不执行ByteArray编码,并且在我编码到ByteArray时失败,它就会工作,这让我相信这就是问题。我只是不知道如何避开它... – 2012-08-15 02:21:50

+0

嗯...从来没有解决这个问题,然后我在2周后回到它,它突然间工作。我会试图找出什么改变... – 2012-08-30 02:18:45

回答

0

嗯 - 我不知道为什么这个问题离开了。我喜欢@ RowlandShaw的建议,但我并没有真正改变json中的任何内容。希望我能提供更好的解决方案。

1

看起来像服务器响应“404找不到”。您请求的资源是否存在于服务器上?

+0

嗨Feroze,我可以证实它确实存在 - 如果我复制JSON变量到Fiddler,我得到一个201创建的响应 - 所以它似乎是什么只是错误的我的HttpWebRequest和我的异步方法的使用...我的意思是在我的原始文章中包含该信息。我会更新它。 – 2012-08-11 20:59:22

+0

并且 - 该URL不是我要求的端点的完整URL - 我无法将实际的URL放在论坛中,如果这就是您获得404的地方:)。 – 2012-08-11 21:10:11

1

请问您的JSON包含任何非7位ASCII字符,因为你正在做:

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

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

的字节数可能不等同于您的字符串的字符数,这可能导致格式不正确的请求。

它将使用诸如Fiddler东西来验证什么是真正打算在从仿真器或电话线是值得的(有instructions on the Fiddler website如何做到这一点)

+0

感谢罗兰,我会检查出来的! – 2012-08-16 02:26:59

相关问题