【问题标题】:Why do I get a NullReferenceException when creating an Instance of System.Net.Http.HttpClient()?为什么在创建 System.Net.Http.HttpClient() 的实例时会出现 NullReferenceException?
【发布时间】:2017-02-22 11:10:29
【问题描述】:

在我们的 Xamarin Forms 应用程序中,我们必须从多个 API 加载大量数据。 最简单的方法是直接从 PCL 使用 HttpClient,但是当有数百个时我会收到此错误。

有了这个页面,我可以在一个新的 PCL 项目中重现这个问题。

using System;
using Xamarin.Forms;

namespace HTTPTest
{
public class HTTPTestPage : ContentPage
{
    int Index = 0;

    public HTTPTestPage()
    {
        Content = new Label
        {
            Text = "HTTP Test"
        };
    }

    protected override void OnAppearing()
    {
        base.OnAppearing();
        StartLoading();
    }

    void StartLoading()
    {
        for (int i = 0; i < 400; i++)
        {
            if (string.IsNullOrEmpty(LoadStringFromEndpoint("https://google.de")))
            {
                break;
            }
        }
    }

    public string LoadStringFromEndpoint(string url)
    {
        System.Diagnostics.Debug.WriteLine("LoadFromEndpoint: " + url);
        try
        {
            Index++;
            var client = new System.Net.Http.HttpClient();
            return client.GetStringAsync(url).Result;
        }
        catch (NullReferenceException ex)
        {
            System.Diagnostics.Debug.WriteLine($"{ex.Message} at Index: {Index}");
            System.Diagnostics.Debug.WriteLine(ex.StackTrace);
        }
        return string.Empty;
    }
 }
}

结果如下:

LoadFromEndpoint: https://google.de
Object reference not set to an instance of an object at Index: 123
  at System.Net.Http.RuntimeOptions.Read () [0x0002c] in /Users/builder/data/lanes/3985/9d6e1ab1/source/xamarin-macios/src/ObjCRuntime/RuntimeOptions.cs:229 
  at System.Net.Http.RuntimeOptions.GetHttpMessageHandler () [0x00000] in /Users/builder/data/lanes/3985/9d6e1ab1/source/xamarin-macios/src/ObjCRuntime/RuntimeOptions.cs:265 
  at System.Net.Http.HttpClient.GetDefaultHandler () [0x00000] in /Library/Frameworks/Xamarin.iOS.framework/Versions/10.4.0.121/src/mono/mcs/class/System.Net.Http/HttpClientEx.cs:36 
  at System.Net.Http.HttpClient..ctor () [0x00000] in /Library/Frameworks/Xamarin.iOS.framework/Versions/10.4.0.121/src/mono/mcs/class/System.Net.Http/HttpClientEx.cs:24 
  at HTTPTest.HTTPTestPage.LoadStringFromEndpoint (System.String url) [0x00020] in [...]HTTPTest/HTTPTestPCL/HTTPTestPage.xaml.cs:41 

如果我得到这个异常一次然后加载一个文件,我也会得到一个 System.IO.Exception(打开的文件太多)。 有没有办法解决这个问题(最好不使用它)?

【问题讨论】:

    标签: c# xamarin xamarin.ios xamarin.forms


    【解决方案1】:

    您不应该创建那么多 HttpClient 实例。这是一个允许同时进行多个连接的对象。所以在你的LoadStringFromEndpoint之外定义你的对象。

    "默认的 HttpClient 是开始发送请求的最简单方式。单个 HttpClient 可用于同时发送任意数量的 HTTP 请求,因此在许多情况下,您只需创建一个 HttpClient,然后将其用于您的所有要求。”

    更多info

    【讨论】:

      猜你喜欢
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      相关资源
      最近更新 更多