前提
現在、クライアントPCのブラウザからAzure AppServiceを経由してIPアドレス制限がかかっているAPIにアクセスし、情報を取得するプログラムを実装済みで運用しております。
セキュリティの関係でクライアントから直接はAPIアクセスを禁じていて、.NetFramework4.6.1のC#で構築しているAPIのIPアドレスからのみ接続を許可している状況です。
利用イメージとして、クライアントPCブラウザからクエリ文字列でhttps://localhost/api/translate にアクセスしてもらい、取得したパラメータをhttp://XXX.jp/api/translate/へGETでアクセスして、戻り値をjson形式で
クライアントに戻す形になります。
C#
1public class TranslateController : ApiController 2 { 3 [HttpPost] 4 public HttpResponseMessage Get([FromUri]Maps value) 5 { 6 Translate tran = new Translate(); 7 8 tran.Client_id = value.Client_id; 9 tran.Text = value.Text; 10 tran.From_lang = value.From_lang; 11 tran.To_lang = value.To_lang; 12 13 //文字コードを指定する 14 Encoding encoding = System.Text.Encoding.GetEncoding("utf-8"); 15 16 string uri = "http://XXX.jp/api/translate/"; 17 18 uri = String.Concat(uri, "? "&text=", tran.Text, "&from_lang=", tran.From_lang, "&to_lang=", tran.To_lang); 19 20 //WebRequestの作成 21 System.Net.WebRequest req = System.Net.WebRequest.Create(uri); 22 23 req.Method = "GET"; 24 25 //サーバーからの応答を受信するためのWebResponseを取得 26 System.Net.WebResponse res = req.GetResponse(); 27 System.IO.Stream resStream = res.GetResponseStream(); 28 System.IO.StreamReader sr = new System.IO.StreamReader(resStream, encoding); 29 30 string responseBody = sr.ReadToEnd(); 31 sr.Close(); 32 33 TransrateResponseMessage transrateResponseMessage = JsonConvert.DeserializeObject<TransrateResponseMessage>(responseBody); 34 35 string result = AISignage.ResponseJsonSerializer.Serialize(transrateResponseMessage); 36 37 HttpResponseMessage resMsg = new HttpResponseMessage(HttpStatusCode.OK); 38 StringContent sc = new StringContent(result, System.Text.Encoding.GetEncoding("UTF-8"), "application/json"); 39 40 resMsg.Content = sc; 41 42 return resMsg; 43 } 44 }
こちらのプログラムに追加機能として、、このような形でクライアント → API → IPアドレス制限がかかっているWebページを表示させたいと思っています。
まず、練習でGoogleMapのページを表示するように下を作成しました。(特に変数等は入力しないで直打ちURLのアクセスです)
しかし、GoogleChromeでhttps://localhost/api/Maps にアクセスしたところ、空白のページが表示されるだけでした。
C#
1 public class MapsController : ApiController 2 { 3 [HttpGet] 4 public HttpResponseMessage Get([FromUri]Maps value) 5 { 6 7 Maps map = new Maps(); 8 map.lat = value.lat; 9 map.lon = value.lon; 10 11 //文字コードを指定する 12 Encoding encoding = System.Text.Encoding.GetEncoding("utf-8"); 13 //練習 14 uri = "https://www.google.com/maps/place/%E6%9D%B1%E4%BA%AC%E9%83%BD%E5%BA%81/@35.6916588,139.6949166,14.73z/data=!4m5!3m4!1s0x60188cd4b71a37a1:0xf1665c37f38661e8!8m2!3d35.6896355!4d139.6921009?hl=ja"; 15 16 17 18 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 19 20 WebClient wc = new WebClient(); 21 try 22 { 23 wc.Encoding = Encoding.UTF8; 24 string text = wc.DownloadString(uri); 25 HttpResponseMessage resMsg = new HttpResponseMessage(HttpStatusCode.OK); 26 StringContent sc = new StringContent(text, System.Text.Encoding.GetEncoding("UTF-8"), "text/html"); 27 resMsg.Content = sc; 28 29 return resMsg; 30 31 } 32 catch (WebException exc) 33 { 34 //失敗した際は空欄を返す 35 HttpResponseMessage resMsg = new HttpResponseMessage(HttpStatusCode.OK); 36 StringContent sc = new StringContent("", System.Text.Encoding.GetEncoding("UTF-8"), "text/html"); 37 38 resMsg.Content = sc; 39 40 return resMsg; 41 } 42 43 44 } 45 }
発生している問題・エラーメッセージ
ブラウザからhttps://localhost/api/Mapでアクセスしても、本来表示させたい東京都庁のMAPが表示されない
URL
1https://www.google.com/maps/place/%E6%9D%B1%E4%BA%AC%E9%83%BD%E5%BA%81/@35.6916588,139.6949166,14.73z/data=!4m5!3m4!1s0x60188cd4b71a37a1:0xf1665c37f38661e8!8m2!3d35.6896355!4d139.6921009?hl=ja
開発者ツールで確認したところ、GoogleMapにアクセスした際に実行されるScriptファイルなどがhttp://localhost/になっているため、404で表示されないのが原因というところまでは確認できました。(相対パスで指定されているScriptファイルが取得できない)
URL
1//直接接続した場合のURL 2https://www.google.com/maps/_/js/k=maps.m.ja.7rVG_8q465Y.O/m=sc2,per,mo,lp,ep,ti,ds,stx,pwd,ppl,log,std,b/rt=j/d=1/rs=ACT90oHl_nLra75AA7H-xA8ZqMSs533aUg 3//サーバ経由で接続した場合のURL 4http://localhost/maps/_/js/k=maps.m.ja.7rVG_8q465Y.O/m=sc2,per,mo,lp,ep,ti,ds,stx,pwd,ppl,log,std,b/rt=j/d=1/rs=ACT90oHl_nLra75AA7H-xA8ZqMSs533aUg
実現したいこと
本来はリバースプロキシなどを用意して実現するべきことだとは思っておりますが、
別途IaaSを用意することが難しいことと、IPアドレス許可の追加に時間がかかるため、
できればすでにIPアドレスが許可されているAppService上で実現できないかと考えております。
恐れ入りますが、なにか対応方法についてご教授いただけますでしょうか。
補足情報(FW/ツールのバージョンなど)
.Netframework 4.6.1
Microsoft VisualStudio 2017 Ver15.9.6
回答1件
あなたの回答
tips
プレビュー