2

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

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

任何想法?

谢谢

在此处输入图像描述

4

3 回答 3

4

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

于 2013-01-15T12:42:19.070 回答
2

我知道这是一个旧线程,但我刚刚看到 Xamarin 终于System.Net.HttpXamarin.Android 4.8中给出了,所以也想和你分享一下。

谢谢。

于 2013-08-05T09:22:51.887 回答
1

您不能使用HttpClient(还没有!),但您仍然可以使用该System.Net.HttpWebRequest对象,它确实HttpClient可以提供方便的包装器(尤其是在访问 Web API 控制器时)。

这是我正在处理的当前项目的示例(它使用的是 monodroid 端口NewtonSoft.Json,而不是标准端口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 模式,但如果你只需要完成某事,它确实有效。

于 2013-02-15T05:24:24.710 回答