如何使用HttpWebRequest与async&等待

时间:2014-09-11 12:15:17

标签: android xamarin xamarin.android

我也是Xamarin和C#的新手。我尝试用一​​些信息向我的服务器发出Http请求。 通常,android Native a使用AsyncTask和HttpClient。并构建一个json对象或名称值对,并对其进行加密以将信息与请求集成。 但是当我尝试用xamarin做同样的事情时,我遇到了一些问题。

  1. 如果我尝试导入命名空间
  2.   

    使用System.Net.Http.HttpClient   比我的xamarin没有这个命名空间

    1. 由于上述问题,我尝试使用HttpWebRequest。但是当我使用asyc并等待它时,我没有得到服务器的任何响应。
    2. 我是xamarin的新手所以我不确定async和await关键字。 我读了很多文章,但没有运气:(

      单击按钮我调用下面的方法

       public async Task<int> ValidateUser(){
          try{
           var request = HttpWebRequest.Create (URL);
           request.Method = "GET/POST";
           String postString = String.Format ("AAA ={0}&BBB={1}&CCC={2}", "111", 
                                                "222","333");
      
              byte[] postByte = Encoding.UTF8.GetBytes (postString);
      
              Stream st = request.GetRequestStream ();
      
              //I am reaching here
                  Console.WriteLine("Check for Validity");
      
              request.ContentLength = postByte.Length;
      
              st.Write (postByte, 0, postByte.Length);
      
              st.Close ();
                  Task<Stream> contentTask = request.GetRequestStreamAsync();
                  Stream response = await contentTask;
      
                  String str = response.ToString();
      
                  // this is not getting printed in Console 
                     Console.WriteLine("=====>>"+str);
      
            }
              catch (WebException exception) {
                  string responseText;
                  using (var reader = new StreamReader(exception.Response.GetResponseStream())) {
                      responseText = reader.ReadToEnd ();
                      Console.WriteLine ("====Dude Error"+responseText);
                  }
              }catch(Exception e){
      
              }
              return 1;
          }
      

      任何帮助将不胜感激

2 个答案:

答案 0 :(得分:2)

考虑使用RestSharp,这是为Xamarin创建的一个组件,用于促进Web请求。 Click here了解有关该组件的更多信息。它将促进关于webrequesting的所有事情(如序列化,自动返回类型检测,......)

你的代码看起来像是restsharp:

public async Task<int> ValidateUser(){

     var client = RestClient (URL);
     var request = new RestRequest ("AAA ={0}&BBB={1}&CCC={2}", "111", 
                                          "222","333");

            client.ExecuteAsync (request, response => {

                    WebApiResponse webApiResponse = new WebApiResponse ();

                    webApiResponse.Content = response.Content;
                    webApiResponse.StatusCode = response.StatusCode;
                    webApiResponse.ResponseStatus = (WebApiResponseStatus)response.ResponseStatus;

                    return webApiResponse.Content;
                });         


        return -1

    }

答案 1 :(得分:0)

使用HttpWebRequest是一个坏主意,相反,最好关注为什么你没有System.Net.Http。*命名空间。 Imho最可能的原因是您没有添加System.Net.Http作为项目的参考。

以下是将System.Net.Http。*添加到项目中的方法。

在Visual Studio 2013中:

  • 打开解决方案
  • 打开项目
  • 打开解决方案资源管理器
  • 右键单击“参考文献”
  • 添加参考
  • 点击&#39;搜索程序集&#39;
  • 输入&#39; Http&#39;
  • 选择System.Net.Http
  • 按&#39;确定&#39;

在Xamarin Studio中:

  • 打开解决方案
  • 打开项目
  • 打开解决方案资源管理器
  • 右键单击“参考文献”
  • 修改参考文献
  • 输入&#39; Http&#39;
  • 选择System.Net.Http
  • 按&#39;确定&#39;

之后,当使用System.Net.Http时解决System.Net.Http应该没有问题;&#39;