c# - Xamarin Forms Visual Studio 2015 HttpClient 请求在 iOS 上不起作用

标签 c# visual-studio-2015 xamarin.ios xamarin.forms

我是 Xamarin Forms/Visual Studio 的新手,但这是我目前的情况。 我在 Visual Studio 中有一个带有 Android、iOS 和 Windows Phone 子项目的 Xamarin Forms 项目。我有以下功能登录:

    public async Task<Tuple<bool, object>> Login(LoginCredentials credentials)
    {
        var loginUrl = apiUrl + "/login";
        var json = JsonConvert.SerializeObject(credentials);
        var content = new StringContent(json, Encoding.UTF8, "application/json");
        try
        {
            Debug.WriteLine("start of try block");
            HttpResponseMessage response = await client.PostAsync(loginUrl, content);
            Debug.WriteLine("this will not print on iOS");
            string bodyStr = await response.Content.ReadAsStringAsync();
            if (response.IsSuccessStatusCode)
            {
                // code that does stuff with successful response
            } else
            {
                // code that does stuff with bad response
            }
        } catch (Exception e)
        {
            Debug.WriteLine(e);
            return new Tuple<bool, object>(false, e.Message);
        }
    }

正如您从 Debug.WriteLine() 中看到的那样,该行抛出异常:

HttpResponseMessage response = await client.PostAsync(loginUrl, content);

异常是 System.NullReferenceException: 对象引用未设置到对象的实例

但是,这个异常只发生在 iOS 上。 Android 和 Windows Phone 都可以成功发出此请求。

我的第一个假设是它是 Apple 的 ATS 这是有道理的,因为我的服务器只是一个不使用 https 的开发实例。所以我粘贴了

<key>NSAppTransportSecurity</key>
<dict>
     <key>NSAllowsArbitraryLoads</key>
     <true/>
</dict>

到 iOS 项目的 Info.plist。仍然没有运气。

我还在其他地方读到一个问题,它说要确保 Windows 上的 Visual Studio 和 Mac 上的 Xamarin 都是最新的,我也已经确定了这一点。

另外 apiUrl 不是 http://localhost 我在本地网络上使用 IP(因为 Mac 和 iOS 模拟器在不同的机器上运行)这我已经确认是正确的。

如果我不得不猜测这一点,我会说它仍然是 ATS 设置未正确设置的问题,但我无法确认这一点。不知道从这里去哪里。我将继续调试和添加更新,但非常感谢任何帮助。

更新:

根据 Oleg Bogdanov 的建议,我的客户端实例仅在运行 iOS 时未正确实例化。

调试 iOS 时: iOS HttpClient Debug

调试Android时: Android HttpClient Debug

现在的任务是弄清楚为什么会在 iOS 上发生这种情况。下面是client初始化代码。我已经尝试了当前位置和评论位置。

public class API
{
    public HttpClient client = new HttpClient();
    public string apiUrl = "http://myApiUrl";

    public API()
    {
        //this.client = new HttpClient();
    }

    public async Task<Tuple<bool, object>> Login(LoginCredentials credentials)
    {
        // login function code
    }
}

我会继续对此进行调试,并在有任何新进展时发布另一个更新。像往常一样,非常感谢任何帮助。

最佳答案

我找到了解决方案 here .

我将 NuGet Install-Package Microsoft.Net.Http 运行到 Portable 项目,它现在可以正常工作了。

关于c# - Xamarin Forms Visual Studio 2015 HttpClient 请求在 iOS 上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41623073/

相关文章:

.net - 编译时间可以得到改善。运行 "dotnet build --build-profile"获取更多信息

visual-studio-2015 - Visual Studio 2015 卡住初始化模板

c# - MVVM灯下的异步命令执行

C# - 使字段/属性有条件地只读

c# - 将返回值转换为泛型

c++ - 如何在 LabVIEW 的 DLL 中打开 OpenCV 结构化边缘检测器的模型文件?

ios - 在 Xamarin iOS 13 中自定义导航栏不起作用

ios - uitableviewcontroller 上带有按钮的工具栏 [Monotouch 如果可能的话]

iphone - 在 MonoTouch 中使用 AVPlayer 播放背景音频?

c# - 如何使用 linq 将列数据移动到同一行中的另一列