C# - Xamarin - HttpClient - 由于对象的当前状态,操作无效 - iOS
C# - Xamarin - HttpClient - Operation is not valid due to the current state of the object - iOS
我正在开发一个发出 HTTP 请求的跨平台库。它在 Android 上运行良好,但是当我尝试在 iOS 上使用它时出现异常,我不知道如何修复它。
这是我的代码:
// method from cross platform library
Task.Factory.StartNew(delegate
{
try
{
var client = new HttpClient();
// some other setup stuff
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.post, "http://myurl.com...");
var task = client.SendAsync(request);
task.Wait(); // Exception thrown on this line
var response = task.Result;
var responseString = response.Content.ReadAsStringAsync().Result;
}
catch (Exception e)
{
}
}
在 task.Wait();
我得到一个 System.AggregateException
内部异常 System.InvalidOperationException
说 Operation is invalid due to the current state of the object.
试图找到一些解决方案,我发现问题可能是由在 UI 线程上调用它引起的。但这就是将所有内容包装在 Task.Factory.StartNew
.
中的全部意义所在
我已尽我所能,但仍未解决问题。任何帮助将不胜感激。
编辑:
我决定在 iPhone 模拟器上尝试我的解决方案。是iPhone6模拟器运行iOS10。我的物理设备是一样的。它可以在模拟器上运行,但由于某种原因不能在物理设备上运行...很奇怪。
编辑 2:
感谢@YuriS 找到解决方案。
您可以做的是:
1) 转到 ios 项目的引用
2)编辑参考
3) 检查 'System.Net.Http'
android 的行为相同。
https://bugzilla.xamarin.com/show_bug.cgi?id=17936
http://motzcod.es/post/78863496592/portable-class-libraries-httpclient-so-happy
似乎所有 post 都指向 System.Net.Http
无论问题如何,都有更好的方法 this.One:
public static async Task PostRequest()
{
try
{
HttpClient client = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "https://myuri");
//request.Headers.Add("", "");
var response = await client.SendAsync(request);
var responseString = await response.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
}
}
如果你想等到函数完成你调用
await PostRequest();
如果您不需要等待,则只需在调用中省略 "await" 或使用
PostRequest.ContinueWith((t)=>
{
});
您还需要在函数内处理异常,因此只返回 Task 可能不是最好的。我的回答只是基于原始函数签名
我正在开发一个发出 HTTP 请求的跨平台库。它在 Android 上运行良好,但是当我尝试在 iOS 上使用它时出现异常,我不知道如何修复它。
这是我的代码:
// method from cross platform library
Task.Factory.StartNew(delegate
{
try
{
var client = new HttpClient();
// some other setup stuff
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.post, "http://myurl.com...");
var task = client.SendAsync(request);
task.Wait(); // Exception thrown on this line
var response = task.Result;
var responseString = response.Content.ReadAsStringAsync().Result;
}
catch (Exception e)
{
}
}
在 task.Wait();
我得到一个 System.AggregateException
内部异常 System.InvalidOperationException
说 Operation is invalid due to the current state of the object.
试图找到一些解决方案,我发现问题可能是由在 UI 线程上调用它引起的。但这就是将所有内容包装在 Task.Factory.StartNew
.
我已尽我所能,但仍未解决问题。任何帮助将不胜感激。
编辑:
我决定在 iPhone 模拟器上尝试我的解决方案。是iPhone6模拟器运行iOS10。我的物理设备是一样的。它可以在模拟器上运行,但由于某种原因不能在物理设备上运行...很奇怪。
编辑 2:
感谢@YuriS 找到解决方案。
您可以做的是: 1) 转到 ios 项目的引用 2)编辑参考 3) 检查 'System.Net.Http'
android 的行为相同。
https://bugzilla.xamarin.com/show_bug.cgi?id=17936
http://motzcod.es/post/78863496592/portable-class-libraries-httpclient-so-happy
似乎所有 post 都指向 System.Net.Http
无论问题如何,都有更好的方法 this.One:
public static async Task PostRequest()
{
try
{
HttpClient client = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "https://myuri");
//request.Headers.Add("", "");
var response = await client.SendAsync(request);
var responseString = await response.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
}
}
如果你想等到函数完成你调用
await PostRequest();
如果您不需要等待,则只需在调用中省略 "await" 或使用
PostRequest.ContinueWith((t)=>
{
});
您还需要在函数内处理异常,因此只返回 Task 可能不是最好的。我的回答只是基于原始函数签名