以前にカスタム ApiApps を LogicApps から利用したことがあるのですが、そこから大幅に構造が変わったこともあり、最近になってようやくあらためてやってみようと思った次第です。
通常の流れでは Azure ApiApps を作成して、それを LogicApps から呼び出すだけなのですが、表題にもある通り VB.NET でそれをやってみたものとなります。わざわざこう書いているので、なんとなくわかった方もいるでしょうが、VB.NET 用の ApiApps テンプレートはいまだに提供されていません。
(VS2015)
(VS2017)
実際のところ、WebApps も ApiApps もほぼほぼ同じものですので、技術的には可能というか、なぜできないようにしているのかがわからないレベルの話なのですが、現時点の仕様として VB を選択した場合に、ApiApps は新規作成できません。しかしデプロイすることはできたりしますので、今回は VB.NET 製の ApiApps を LogicApps から認識させてみようと思います。
まずは ApiApps を作成するためのテンプレートですが、以前に書いたエントリにて公開している VB.NET 向け ApiApps のテンプレートを利用することにします。これは既存の C# 用 ApiApps テンプレートを VB 向けにいろいろ書き直したものとなっています。なお、以前はこのテンプレートからデプロイすることで ApiApps の新規作成も行えていたのですが、現在ではそれもままならず、新規作成できるのは WebApps のみとなっています。
実際のトリガのソースとしては、MSDN にも記載があるように Github でサンプルが公開されています。しかしこれは当然 C# のみですので、これを VB 用に書き換えを行います。
Imports System.Net | |
Imports System.Web | |
Imports System.Net.Http | |
Imports System.Web.Http | |
Namespace Controllers | |
Public Class PollTriggerVBController | |
Inherits ApiController | |
Public Function [Get](Optional triggerState As String = "") As HttpResponseMessage | |
If String.IsNullOrEmpty(triggerState) Then | |
triggerState = Date.UtcNow.ToString() | |
Return GenerateAsyncResponse(HttpStatusCode.Accepted, triggerState, "15") | |
Else | |
If Date.Parse(triggerState) < Date.UtcNow Then | |
triggerState = Date.UtcNow.AddMinutes(2).ToString() | |
Return GenerateAsyncResponse(HttpStatusCode.OK, triggerState, "15") | |
End If | |
End If | |
End Function | |
Private Function GenerateAsyncResponse(code As HttpStatusCode, triggerState As String, retryAfter As String) As HttpResponseMessage | |
Dim responseMessage As HttpResponseMessage = Request.CreateResponse(code) 'Return a 200 to tell it to fire. | |
responseMessage.Headers.Add("location", String.Format("{0}://{1}/api/polltrigger?triggerState={2}", Request.RequestUri.Scheme, Request.RequestUri.Host, HttpUtility.UrlEncode(triggerState))) 'Where the engine will poll to check status | |
responseMessage.Headers.Add("retry-after", retryAfter) 'How many seconds it should wait. If multiple files are available you can return a 0 here and the engine will immediately come back and grab other triggers. | |
Return responseMessage | |
End Function | |
End Class | |
End Namespace |
書き換えたものは上記のようになります。ここまでできると、次はデプロイ先を用意することになります。
先程書いたように、VB.NET の場合は、ApiApps の新規作成が行えません。どうするかというと、あらかじめポータル上で ApiApps を作成しておき、そこに対してデプロイする形を採ることになります。こうしないと、LogicApps 側で ApiApps と認識されないため、LogicFlow 上で呼び出すことができません。
ポータル上で新規作成した後に、デプロイ先として選択します。ここで表示されているアイコンが ApiApps となっているのが確認できるかと思います。この状態であれば、ApiApps として VB なアプリをデプロイすることが可能です。
無事にデプロイできたら、次に LogicApps から ApiApps へとアクセス可能にする設定を行います。具体的には Swagger で作成されている API 定義アドレスの設定と、CORS の設定です。
API 定義は https://hogehoge.azurewebsites.net:443/swagger/docs/v1 の形で指定します。ここでは HTTP ではなく HTTP/S である必要があります。
CORS については、LogicApps のデザイナーなアドレスを指定するのですが、以前設定した ema ~なアドレスでは現在アクセスできないのが確認できています。残念ながら * を指定し、どこからでもアクセス可能とすることになります。
このように設定を行うことで、LogicApps 側から ApiApps が認識され、上記のように一覧から選択が可能になります。
選択すると、API として提供されているものの一覧が表示されますが、注意が必要なのはトリガとアクションの区別が行われていないので、トリガとして利用できないものや、アクションとして利用できないものも一覧上に表示されます。
一覧から選択するとこのように表示され、自分で実装した APIApps が利用できているのがわかると思います。このデザイナー上の表示についても、少しはカスタマイズができるとのことなので、次はそのあたりを挑戦してみようと思います。
0 件のコメント:
コメントを投稿