2

我正在开发一个发出 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.InvalidOperationExceptionOperation is invalid due to the current state of the object.

试图找到一些解决方案,我发现问题可能是通过在 UI 线程上调用它引起的。但这就是将这一切都包含在Task.Factory.StartNew.

我已经尝试了所有我知道要做的事情,但还没有解决这个问题。任何帮助将不胜感激。

编辑:

我决定在 iPhone 模拟器上尝试我的解决方案。这是一个运行 iOS 10 的 iPhone 6 模拟器。我的物理设备是一样的。它适用于模拟器,但由于某种原因不适用于物理设备......非常奇怪。

编辑2:

感谢@YuriS 找到解决方案。

来自:https ://forums.xamarin.com/discussion/36713/issue-with-microsoft-http-net-library-operation-is-not-valid-due-to-the-current-state-of-the-对象

您可以做的是:1)转到ios项目的参考资料2)编辑参考资料3)检查'System.Net.Http'

android 的行为是相同的。

4

1 回答 1

2

此处描述的问题可能很少: https ://forums.xamarin.com/discussion/36713/issue-with-microsoft-http-net-library-operation-is-not-valid-due-to-the-current-对象状态

https://bugzilla.xamarin.com/show_bug.cgi?id=17936

带有 HttpClient 的 Xamarin.iOS 项目中的“操作无效”错误

http://motzcod.es/post/78863496592/portable-class-libraries-httpclient-so-happy

似乎所有帖子都指向 System.Net.Http

无论问题如何,都有更好的方法来做到这一点。其中之一:

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();

如果您不需要等待,则只需在通话中省略“等待”或使用

PostRequest.ContinueWith((t)=>
{
});

此外,您需要在函数中处理异常,因此可能只返回 Task 不是最好的。我只是根据原始函数签名来回答

于 2016-10-25T17:37:55.717 回答