【发布时间】: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)端点。
-
因此,由于您使用的是
httphttpclient 提供程序(请参阅此设置的项目设置/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