ログインページの処理をWebAPIで作成したのですが、いざ動かしてみるとエラーの出ること出ること。
前回の内容はコチラをご参考ください。
さすがに今回は苦労しました…。
今回対応したエラー内容一覧
先に一覧にしておきます。
ソースコードに関しては割愛します。WebAPIに対してGetリクエストを投げるだけの簡単なモノなので。
An error occurred while sending the request
正直このエラーが一番大変でした。というのも明確な例外発生内容が出力されないので。
上記を参考に、まずはAndroidプロジェクトからの参照内容を確認。
案の定『System.Net.Http』への参照が含まれていなかったため、参照を追加しました。
続いて、AndroidプロジェクトのHttpClientを確認。
『Default』設定になっていたので、『Android』に変更しました。
するとエラー内容が少し明確になりました。次に続きます。
Failed to connect to localhost/127.0.0.1:44341
ループバックアドレスを指定していたのですが、繋がらないよと言われ…。
ブラウザからアクセスしてみたところ、普通にレスポンスが返ってきたのでこれも悩みました。
「IIS Expressに対してアクセスできないの!?」と最初は考えてしまい、ローカルのIISに急遽デプロイ。
しかし、それでもループバックアドレス指定のリクエストは通らず…。
さらに調べてみると、Androidエミュレータからループバックアドレスを指定する場合、『127.0.0.1』ではないことが判明しました。
『localhost』の解釈を『127.0.0.1』から変更する、という方法も見つかったのですが、正直面倒だったので『10.0.2.2』を直接指定することにしました。
IISに公開していて、ポート番号も開けてあるのであれば開発PCのIPアドレスを指定してもいいのかもしれません。
Cleartext HTTP traffic to 127.0.0.1 not permitted
画像ではループバックアドレスを示す『127.0.0.1』が表示されてしまっていますが、『10.0.2.2』でも同様のエラーが検出されました。
コチラはXamarinというよりはAndroid9.0特有の現象らしく、英語のサイトがメインでしたが日本語での解決方法も見つかりました。
『Androidプロジェクト』⇒『Resources』配下に『xml』フォルダを作成し、下記のファイルを配置しました。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">10.0.2.2</domain>
</domain-config>
</network-security-config>
次に『AndroidManifest.xml』に上記ファイルを読み込むよう追記します。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.appname" android:installLocation="auto">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application android:label="Sample.Android" android:icon="@mipmap/ic_launcher"
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="true">
</application>
</manifest>
ここまで来てやっと、Http通信を行うことが出来るようになりました。長かった…。
まとめ
Androidのバージョンによる壁もありましたが、なかなか大変でしたね…。
以上です。
コメント