是否可以在MonoDroid中使用HttpClient类?

时间:2013-01-15 10:31:48

标签: xamarin.android

我正在尝试在MonoDroid项目中使用HttpClient类,但它看起来像System.Net.http命名空间它无效。

我尝试将项目中的引用添加到System.Net.http.dll,但它似乎在引用列表中不可用。

有什么想法吗?

THKS

enter image description here

3 个答案:

答案 0 :(得分:4)

HttpClient是一个.NET 4.5类,在Mono for Android中尚不可用。 Mono本身在3.0版中添加了支持,但Mono for Android仍然基于Mono 2.10。我知道Xamarin现在正在努力将Mono for Android(和MonoTouch)更新到Mono 3.0,但据我所知,还没有设置发布日期。

答案 1 :(得分:2)

我知道这是一个旧帖子,但我刚看到Xamarin终于在Xamarin.Android 4.8中给了System.Net.Http,所以想也与你分享。

感谢。

答案 2 :(得分:1)

你不能使用HttpClient(还是!),但你仍然可以使用System.Net.HttpWebRequest对象,它实际上做了HttpClient可以提供方便包装的东西(尤其是在击中时)一个Web API控制器。)

以下是我正在处理的当前项目的示例(它使用NewtonSoft.Json的monodroid端口,而不是标准System.Runtime.Serialization.Json):

    private void AddARecord()
    {
        var cartesian = new Cartesian()
                            {
                                Description = "next item blah",
                                X = 5,
                                Y = 10,
                                Z = 15,
                            };

        string json = JsonConvert.SerializeObject(cartesian);

        var request = new HttpWebRequest(new Uri(_url)) {ContentType = "application/json", Method = "POST"};
        var sw = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII);
        sw.Write(json);
        sw.Close();

        request.BeginGetResponse(ProcessJsonResponseForSingleResult, request);
    }

...我正在点击的Web API控制器执行任意操作,保存我刚刚发送的对象,然后调整描述,以便我知道它有效。然后它将调整后的对象发回...

然后回调ProcessJsonResponseForSingleResult看起来像

    private void ProcessJsonResponseForSingleResult(IAsyncResult ar)
    {
        var request = (HttpWebRequest)ar.AsyncState;
        var response = request.EndGetResponse(ar);

        using (var outputStream = new StreamReader(response.GetResponseStream(), System.Text.Encoding.ASCII))
        {
            var jsonString = outputStream.ReadToEnd();
            Log.Info("PJRFSR", string.Format("JSON string: {0} - deserialising...", jsonString));
            var cartesian = JsonConvert.DeserializeObject<Cartesian>(jsonString);

            RunOnUiThread(() => UpdateUiTextView(cartesian.Description));
        }

    }

是的,我知道,它使用了我不喜欢的BeginAsync / EndAsync模式,但如果你只是需要完成某些事情,它确实有效。