質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

Q&A

0回答

2101閲覧

Azure Functionsの基礎を教えてください

Cat9

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

0グッド

3クリップ

投稿2019/09/24 11:38

前提・実現したいこと

こんばんは。
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問