前提・実現したいこと
こんばんは。
Azure Functionsについて質問があります。
C#でデスクトッププログラミングはしたことがありますが、Web開発は初心者です。
Azure Functionsで、HTTPトリガーの処理を書いています。
Windows10 Home、Edge、Azure、C#、Visual Studio 2019 Communityの組み合わせです。
まず、EdgeでAzureにログインし、Http triggerのテンプレートをコピーして作成しました。デフォルトのままです。
C#
1run.csx 2#r "Newtonsoft.Json" 3 4using System.Net; 5using Microsoft.AspNetCore.Mvc; 6using Microsoft.Extensions.Primitives; 7using Newtonsoft.Json; 8 9public static async Task<IActionResult> Run(HttpRequest req, ILogger log) 10{ 11 log.LogInformation("C# HTTP trigger function processed a request."); 12 13 string name = req.Query["name"]; 14 15 string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); 16 dynamic data = JsonConvert.DeserializeObject(requestBody); 17 name = name ?? data?.name; 18 19 return name != null 20 ? (ActionResult)new OkObjectResult($"Hello, {name}") 21 : new BadRequestObjectResult("Please pass a name on the query string or in the request body"); 22} 23
これで、Edgeで、テストを実行してみました。
出力はHello Azureと出ました。
HTTPメソッドをPOSTのままで、要求本文に
{"name":"Cat"}
としたり、HTTPメソッドをGETにして、クエリのnameにCatとかを設定して、Hello, Catと表示できました。
このEdgeの状態で、関数のURLを取得としてみると、ポップアップを表示し、
https://first-test-september.azurewebsites.net/api/HttpTrigger1?code=gQPTuyqSqjaLHBaMCrIjXm2wb5vLCis9qaLEo2NSOE1AFbOE7HQAyo==
のような文字列を表示します。
発生している問題・エラーメッセージ
Q1)これはだれでもが使える公開のURLではないと思います。
だれでもが使える公開のURLを手にするにはどうしたらよいのでしょう?
なにか作成したAzure Functionsの公開作業のようなことが必要でしょうか?
Q2)このURLをEdgeで開くと、
Please pass a name on the query string or in the request body
というエラーになります。
POSTでnameを指定するには、どうすればよいのでしょう?
https://first-test-september.azurewebsites.net/api/HttpTrigger1?code=gQPTuyqSqjaLHBaMCrIjXm2wb5vLCis9qaLEo2NSOE1AFbOE7HQAyo==?name=Cat
と指定すると、HTTP 404エラーとなり表示できませんとエラーになります。
Q3)いままではEdgeを使って開発していましたが、Visual Studio 2019 Communityを使って開発してみました。
プロジェクトでAzure Functionsを選択し、Http triggerを作りました。
C#
1using System; 2using System.IO; 3using System.Threading.Tasks; 4using Microsoft.AspNetCore.Mvc; 5using Microsoft.Azure.WebJobs; 6using Microsoft.Azure.WebJobs.Extensions.Http; 7using Microsoft.AspNetCore.Http; 8using Microsoft.Extensions.Logging; 9using Newtonsoft.Json; 10 11namespace FunctionApp1 12{ 13 public static class Function1 14 { 15 //http://localhost:7071/api/Function1?name=Cat 16 [FunctionName("Function1")] 17 public static async Task<IActionResult> Run( 18 [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, 19 ILogger log) 20 { 21 log.LogInformation("C# HTTP trigger function processed a request."); 22 23 string name = req.Query["name"]; 24 25 string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); 26 dynamic data = JsonConvert.DeserializeObject(requestBody); 27 name = name ?? data?.name; 28 29 return name != null 30 ? (ActionResult)new OkObjectResult($"Hello, {name}") 31 : new BadRequestObjectResult("Please pass a name on the query string or in the request body"); 32 } 33 } 34} 35
デバッグ実行して、Edgeでhttps://localhost:7071/api/Function1?name=Catを開くと、ブラウザの内部にHello, Catと表示できました。動いているようです。
そこでこのFunction AppのプロジェクトをAzureにデプロイしてみました。ソリューションエクスプローラでプロジェクトを選択し、コンテキストメニューで[発行]メニューを選択、醗酵先をAzure関数アプリにして、Azure App serviceを新規作成しました。
発行後、Azure Portalを見ると、Funtion Appが読み取り専用になっています。
json
1function.json 2{ 3 "generatedBy": "Microsoft.NET.Sdk.Functions-1.0.28", 4 "configurationSource": "attributes", 5 "bindings": [ 6 { 7 "type": "httpTrigger", 8 "methods": [ 9 "get", 10 "post" 11 ], 12 "authLevel": "function", 13 "name": "req" 14 } 15 ], 16 "disabled": false, 17 "scriptFile": "../bin/FunctionApp1.dll", 18 "entryPoint": "FunctionApp1.Function1.Run" 19}
「パッケージ ファイルから実行しているため、アプリは現在読み取り専用モードです。変更を加えるには、Zip ファイルの内容と WEBSITE_RUN_FROM_PACKAGE アプリ設定を更新します。」と表示があります。
読み取り専用を変更可能にするにはどうしたらよいのでしょう?
Q4)このEdgeの状態で、関数のURLを取得としてみると、ポップアップを表示し、さきほどと同様のURLを表示します。関数名が違うだけです。
https://second-test-september.azurewebsites.net/api/HttpTrigger1?code=gQPTuyqSqjaLHBaMCrIjXm2wb5vLCis9qaLEo2NSOE1AFbOE7HQAyo==
のような文字列を表示します。
Q5)これはだれでもが使える公開のURLではないと思います。だれでもが使えるURLはどうやって取得すればよいでしょう?
Q6)そのURLにnameを追加するにはどう書けばよいですか?
Q7)このURLを開くと、IDとパスワードを入力する必要があります。なのでだれでも使える状態でないと思いました。このIDとパスワードには、AzureのIDとパスワードを入れてもダメでした。自分でも使えないので困っています。IDとパスワードはAzureのとは違うのだとすると、どこで設定するのでしょう? ご存じでしたら、教えてほしいです。
以上、Web初心者なので、基本的なところで躓いている感じです。よろしくお願いします。
試したこと
上記のとおりです。
補足情報(FW/ツールのバージョンなど)
Windows10 Home、Edge、Azure、C#、Visual Studio 2019 Community
あなたの回答
tips
プレビュー