Drunken Daddy
Drunken Daddy

Reputation: 8001

C#: ModernHttpClient, You're referencing the Portable version in your App - you need to reference the platform (iOS/Android) version

I'm using ModernHttpClient library and I'm to trying to get the Cookies from the httpClient's response

public static async Task<String> loginUser()
{
    var values = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("username", "*****"),
        new KeyValuePair<string, string>("password", "*****"),
    };
    NativeCookieHandler cookieHandler = new NativeCookieHandler();
    NativeMessageHandler messageHandler = new NativeMessageHandler(false, false, cookieHandler);
    var httpClient = new HttpClient(messageHandler);

    var response = await httpClient.PostAsync(RestApiPaths.LOGIN, new FormUrlEncodedContent(values));

    response.EnsureSuccessStatusCode();
    String resultString = await response.Content.ReadAsStringAsync();
    System.Diagnostics.Debug.WriteLine("resultString: " + resultString);
    IEnumerable<Cookie> responseCookies = cookieHandler.Cookies;
    Cookie mCookie = responseCookies.FirstOrDefault();
    RestApiPaths.mCookie = mCookie;
    return resultString;

}

But the below line is giving error:

IEnumerable<Cookie> responseCookies = cookieHandler.Cookies;

Error:

MonoDroid] UNHANDLED EXCEPTION:
[MonoDroid] System.Exception: You're referencing the Portable version in your App - you need to reference the platform (iOS/Android) version
[MonoDroid]   at Gogch.MyClass+<loginUser>c__async0.MoveNext () <0x9e0d9e08 + 0x004b8> in <filename unknown>:0 
[MonoDroid] --- End of stack trace from previous location where exception was thrown ---
[MonoDroid]   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () <0x9d3a3670 + 0x00024> in <filename unknown>:0 
[MonoDroid]   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) <0x9d3a2ff8 + 0x000bb> in <filename unknown>:0 
[MonoDroid]   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) <0x9d3a2dd0 + 0x0008b> in <filename unknown>:0 
[MonoDroid]   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) <0x9d6ecaa8 + 0x0003f> in <filename unknown>:0 
[MonoDroid]   at System.Runtime.CompilerServices.TaskAwaiter`1[TResult].GetResult () <0xa1f0fa18 + 0x0001b> in <filename unknown>:0 
[MonoDroid]   at Gogch.Droid.MainActivity+<button_OnClick>c__async0.MoveNext () <0xaf58c608 + 0x00137> in <filename unknown>:0 
[MonoDroid] --- End of stack trace from previous location where exception was thrown ---
[MonoDroid]   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () <0x9d3a3670 + 0x00024> in <filename unknown>:0 
[MonoDroid]   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>m__0 (System.Object state) <0x9d3a4488 + 0x0003f> in <filename unknown>:0 
[MonoDroid]   at Android.App.SyncContext+<Post>c__AnonStorey0.<>m__0 () <0xa1f0f968 + 0x00027> in <filename unknown>:0 
[MonoDroid]   at Java.Lang.Thread+RunnableImplementor.Run () <0xa1f0f7b8 + 0x0003f> in <filename unknown>:0 
[MonoDroid]   at Java.Lang.IRunnableInvoker.n_Run (IntPtr jnienv, IntPtr native__this) <0xa1f0f710 + 0x0003f> in <filename unknown>:0 
[MonoDroid]   at (wrapper dynamic-method) System.Object:ba036dc5-deef-4850-b986-e1e85c84e6de (intptr,intptr)
[art] JNI RegisterNativeMethods: attempt to register 0 native methods for android.runtime.JavaProxyThrowable
[AndroidRuntime] Shutting down VM
[AndroidRuntime] FATAL EXCEPTION: main
[AndroidRuntime] Process: com.cinch.gogch, PID: 18910
[AndroidRuntime] java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
[AndroidRuntime]    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
[AndroidRuntime] Caused by: java.lang.reflect.InvocationTargetException
[AndroidRuntime]    at java.lang.reflect.Method.invoke(Native Method)
[AndroidRuntime]    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
[AndroidRuntime]    ... 1 more
[AndroidRuntime] Caused by: android.runtime.JavaProxyThrowable: System.Exception: You're referencing the Portable version in your App - you need to reference the platform (iOS/Android) version
[AndroidRuntime]   at Gogch.MyClass+<loginUser>c__async0.MoveNext () <0x9e0d9e08 + 0x004b8> in <filename unknown>:0 
[AndroidRuntime] --- End of stack trace from previous location where exception was thrown ---
[AndroidRuntime]   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () <0x9d3a3670 + 0x00024> in <filename unknown>:0 
[AndroidRuntime]   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) <0x9d3a2ff8 + 0x000bb> in <filename unknown>:0 
[AndroidRuntime]   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) <0x9d3a2dd0 + 0x0008b> in <filename unknown>:0 
[AndroidRuntime]   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) <0x9d6ecaa8 + 0x0003f> in <filename unknown>:0 
[AndroidRuntime]   at System.Runtime.CompilerServices.TaskAwaiter`1[TResult].GetResult () <0xa1f0fa18 + 0x0001b> in <filename unknown>:0 
[AndroidRuntime]   at Gogch.Droid.MainActivity+<button_OnClick>c__async0.MoveNext () <0xaf58c608 + 0x00137> in <filename unknown>:0 
[AndroidRuntime] --- End of stack trace from previous location where exception was thrown ---
[AndroidRuntime]   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () <0x9d3a3670 + 0x00024> in <filename unknown>:0 
[AndroidRuntime]   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>m__0 (System.Object state) <0x9d3a4488 + 0x0003f> in <filename unknown>:0 
[AndroidRuntime]   at Android.App.SyncContext+<Post>c__AnonStorey0.<>m__0 () <0xa1f0f968 + 0x00027> in <filename unknown>:0 
[AndroidRuntime]   at Java.Lang.Thread+RunnableImplementor.Run () <0xa1f0f7b8 + 0x0003f> in <filename unknown>:0 
[AndroidRuntime]   at Java.Lang.IRunnableInvoker.n_Run (IntPtr jnienv, IntPtr native__this) <0xa1f0f710 + 0x0003f> in <filename unknown>:0 
[AndroidRuntime]   at (wrapper dynamic-method) System.Object:ba036dc5-deef-4850-b986-e1e85c84e6de (intptr,intptr)
[AndroidRuntime]    at mono.java.lang.RunnableImplementor.n_run(Native Method)
[AndroidRuntime]    at mono.java.lang.RunnableImplementor.run(RunnableImplementor.java:30)
[AndroidRuntime]    at android.os.Handler.handleCallback(Handler.java:746)
[AndroidRuntime]    at android.os.Handler.dispatchMessage(Handler.java:95)
[AndroidRuntime]    at android.os.Looper.loop(Looper.java:148)
[AndroidRuntime]    at android.app.ActivityThread.main(ActivityThread.java:5443)
[AndroidRuntime]    ... 3 more

I've this code in a PCL. Why am I getting this error? How do I get the cookies correctly?

EDIT:

Now I've modernhttpclient library in both my pcl and ios project to make it work. If I remove it from the ios project. I get the same error.

Upvotes: 14

Views: 1681

Answers (4)

Mikalai Daronin
Mikalai Daronin

Reputation: 8716

For future googlers: it may happen when you update some NuGet reference (e.g. modernhttpclient-updated) to a version which targets Xamarin.Android 8.1 (just for example) while your app targets Xamarin.Android 6.0: in that case your Xamarin.Android project wouldn't reference platform-specific code but only shared.

Pay attention to NuGet warning!

Upvotes: 2

earloc
earloc

Reputation: 2090

Some more clarifications, as explained by Eugene and HeisenBerg. You were trapped by "Bait and Switch"

Upvotes: 0

Eugene Berdnikov
Eugene Berdnikov

Reputation: 2200

Make sure your projects have correct references to assemblies:

  • Android: in the MonoAndroid folder
  • iOS: in the Xamarin.iOS10 folder (or MonoTouch folder)
  • PCL: in the Portable-Net45+WinRT45+WP8+WPA81 folder

If that doesn't help, I suggest to stop using of the ModernHttpClient, due to the next:

  1. Xamarin.iOS provides functionality of the ModernHttpClient out of the box (a bit limited though).
  2. Actually, the ModernHttpClient.NativeMessageHandler does nothing with the cookieHandler parameter. You can check it in the source code (Android, iOS). And you can just handle cookies natively instead of using of ModernHttpClient implementations, see the source code for examples (Android, iOS).

Upvotes: 0

veeprox
veeprox

Reputation: 21

When you added the reference to the solution did you add the reference to the PCL project as well as the iOS and Android projects?

It's the same Nuget package, but the android package adds a reference to

~\packages\modernhttpclient.2.4.2\lib\MonoAndroid

iOS gets a reference to

~\packages\modernhttpclient.2.4.2\lib\Xamarin.iOS10

I'm assuming this is in Visual Studio? Perhaps just uninstall the package and reinstall it (and install it at the solution level).

Upvotes: 1

Related Questions