Sending Http requests from Xamarin Portable Class

2019-02-26 09:44发布

问题:

I have quite decent problems with this very simple task and asking for help. The question is: what is the best and the most reliable way to perform Http requests with timeout from Xamarin PCL?

There are several options:

  1. Using old HttpWebRequest. This solution should definitely be working, but I have problems with BeginGetRequestStream method described in this question: HttpWebRequest BeginGetRequestStream callback never called Also it requres some extra ugly code to implement timeouts properly.

  2. HttpClient. HttpClient is not available in PCL out-of-the-box (I am using Profile 158 required by MvvmCross libraries). I was trying to install Microsoft HTTP Client Libraries but I still cannot compile the PCL project, error is:

    The type or namespace name 'Http' does not exist in the namespace 'System.Net' (are you missing an assembly reference?)

  3. PortableRest NuGet package. Same problem - does not seem to work in PCL. Lots of compilation errors and warnings, for example:

    The primary reference "System.Net.Http" could not be resolved because it has an indirect dependency on the framework assembly "System.Runtime, Version=1.5.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" which could not be resolved in the currently targeted framework. ".NETPortable,Version=v4.0,Profile=Profile158". To resolve this problem, either remove the reference "System.Net.Http" or retarget your application to a framework version which contains "System.Runtime, Version=1.5.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". (MSB3268) (Prototype.Core)

What am I doing wrong? Why am I not able to use such basic standard libraries?

UPDATE

Finally solved the issue by switching to Profile 78 (.NET 4.5). Now I can use HttpClient which is way better and easy to use. It works reliably with all my requests. MvvmCross libraries work fine with Profile 78 as well.

The only issue I have is lack of Timer class. Maybe I should implement it myself using Task.Delay.

回答1:

I recommend using the HttpClient package via NuGet http://www.nuget.org/packages/Microsoft.Net.Http/

This works with profile 78 and MvvmCross. You also get async/await support.



回答2:

What about HttpClient, I've extended Profile 7, so it now supports WP7/8, iOS, Android and WinStore and it works great, no problem yes and I've already complete a couple of projects with it.