ログインページの処理をWebAPIで作成したのですが、いざ動かしてみるとエラーの出ること出ること。

前回の内容はコチラをご参考ください。

さすがに今回は苦労しました…。

以下の動作環境にて確認済み
  • Visual Studio 2019 Community
  • Android 9.0.99
  • .NETStandard.Library 2.0.3
  • Prism.Unity.Forms 7.1.0.431
  • Newtonsoft.Json 12.0.2
  • .NET Framework 4.7.2(WebAPIプロジェクト)

今回対応したエラー内容一覧

先に一覧にしておきます。

エラー内容一覧
  • An error occurred while sending the request
  • Failed to connect to localhost/127.0.0.1:44341
  • Cleartext HTTP traffic to 127.0.0.1 not permitted

ソースコードに関しては割愛します。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通信を行うことが出来るようになりました。長かった…。

まとめ

Xamarin開発を行ったAndroidでHttp通信を行うには
  • Androidプロジェクトからの『System.Net.Http』への参照を追加する。
  • Androidプロジェクトの『Http実装』を『Android』に変更する。
  • ローカルのサーバーにアクセスする場合はループバックアドレスの指定を『10.0.2.2』に変更する。
  • 『network_security_config.xml』を追加する。

Androidのバージョンによる壁もありましたが、なかなか大変でしたね…。

以上です。

スポンサーリンク