【问题标题】:xamarin iOS using shared project with HttpClient not workingxamarin iOS 使用共享项目与 HttpClient 不工作
【发布时间】:2018-06-06 03:29:33
【问题描述】:

我有一个 Xamarin android 项目,它使用共享项目为我的所有网络服务设置,效果很好。在那个共享项目中,我有一个类,其方法通过HttpClient.PostAsync() 调用 REST 端点。我现在正在开发 iOS 版本,并认为只使用我已经为 android 充实的相同类/方法会很轻松,但由于某种原因,iOS 无法正常工作。

我没有抛出任何异常,只是对PostAsync() 的调用似乎已经死了,并且没有做任何我能说的事情。我还尝试了GetAsync() 调用,结果相同...没有任何反应。

下面是一些示例代码:

public class UserService
{
    public async Task<UserModel> LoginUser(UserModel userModel)
    {
        var url = new Uri(Constants.BaseUrl + "v2api/LoginUser");
        try
        {
            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                string userModelString = JsonConvert.SerializeObject(userModel);
                var response = await client.PostAsync(url, new StringContent(userModelString, Encoding.Default, "application/json"));
                if (response.IsSuccessStatusCode)
                {
                    userModel = JsonConvert.DeserializeObject<UserModel>(await response.Content.ReadAsStringAsync());
                }
            }
        }
        catch (Exception e)
        {
            string exceptionString = e.ToString();
        }
        return userModel;
    }
}

我已经在上面放置了断点,它到达了:var response = await 行,但就是这样。我从来没有得到任何回报。如上所述,这适用于 android 项目,只有 iOS 不起作用。我确定我忽略了一些非常简单的东西,我只是不知道它可能是什么。

我尝试将其添加到我的 info.plist 文件中,但没有帮助:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>mysite.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true />
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false />
        </dict>
    </dict>
</dict>

对下一步去哪里有什么建议吗?

tia

【问题讨论】:

  • a) 您使用的是托管提供程序还是 NSUrlSession 提供程序? b) 查看设备日志是否有任何故障 c) 您的站点是否使用自签名证书?
  • 这是我的第一个 xamarin ios 项目,所以我很环保。 1)我不确定托管提供者或 NSUrlSession 提供者是什么意思。我刚刚在我的 xamarin.ios 项目中创建了一个实用程序类,我正在我的共享项目中调用此方法 2) 我如何查看设备日志?我正在 iPhone 6 物理设备上进行测试。 3) 不,现在我只是调用一个 http(不是 https)端点。
  • 因此,由于您使用的是http httpclient 提供程序(请参阅此设置的项目设置/iOS 构建选项),并且 iOS 上的自签名证书问题不起作用。如果你在iOS设备上调试,可以通过app输出面板或者VS4M内部的设备日志面板看到设备日志。
  • @SushiHangover 感谢您的澄清。我现在明白了你所说的不同提供商的意思,我有点尴尬,我之前没有发现(再次,这是我的第一次 iOS 尝试......我更像是一个 android 人)。我尝试了一个几个不同的提供程序,在托管的输出窗口中,我看到它启动了一个新线程,但没有我可以告诉的错误。在 NSUrlSession 的输出窗口中,它说 ATS 阻止了明文 HTTP 资源......所以我觉得这至少是更进一步。似乎它应该在 info.plist 文件中看到我允许的异常,对吧?
  • @SushiHangover 原来我在 info.plist 中丢失了一个密钥 (NSExceptionAllowsInsecureHTTPLoads)。我添加了这一点,错误在输出窗口中消失了,但在 HttpClient.PostAsync() 调用中它仍然没有做任何事情。就像那个方法调用只是吞噬了我的 LoginUser() 方法中的所有内容,然后一切都停止了。

标签: ios xamarin xamarin.ios httpclient


【解决方案1】:

在进行了更多谷歌搜索后,我终于解决了这个问题。这个线程是我的确切问题:https://forums.xamarin.com/discussion/17086/httpclient-postasync-doesnt-work-when-awaited

我用 .Result 调用我的登录方法;显然这在 iOS 中不起作用,但在 Android 中却很奇怪。

Sushi,感谢 iOS Http 方面的教育 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多