The programming pitfalls in C#
Azure用Webジョブアプリ
クエリちゃんの動画投稿数をツイートするサービス
を作ってはまったことろとその対処方法をまとめました。
このアプリのソースはGitHubに投稿してあります。
https://github.com/mtk-f/TweetNicoCountForQuerychan
環境
- Windows 10
- Visual Studio 2015 Community
Visual Studioでの開発
Visual Studioで Azure Webjob のプロジェクトとして開発しました。
コンソールアプリケーションを開発するの同じで、完成したもの普通のコンソールアプリでした。
処理内容は次の通りです。
- nicovideo.jp のWeb APIで「mmd クエリちゃん」をキーワード検索する
- 検索結果のJSON文字列をパース(構文解析)し件数を取得する
- 件数をツイッターに投稿する
非同期処理ではまった
このアプリはWeb APIの利用やツイッターへの投稿を非同期メソッドで処理しています。
コンソールアプリケーションはエントリーポイントのMainメソッドからプログラムを実行し、エントリーポイントを抜けたら終了します。
非同期メソッドの完了を待つにはawaitキーワードで同期待ちします。
ところが
Mainメソッドは非同期処理をawaitキーワードで同期待ちできません。
awaitキーワードが使えないので非同期処理が完了する前にエントリーポイントを抜けてしまい、ツイッターに投稿する前にアプリケーションが終了してしまう事態に陥ってしまいました。
問題の起きるエントリーポイント
非同期メソッドの
Wait()メソッド で対処しました。
Wait()メソッドは非同期処理が終わるまで待ち続けるメソッドです。
対処後のエントリーポイント
Wait()メソッドを使わないときと使うときのアプリの寿命の違いを図にしました。
Newtonsoft.Json ではまった
Newtonsoft.JsonはJSONフォーマットの文字列を匿名型オブジェクトやクラスに変換するライブラリーです。
オブジェクトをJSON文字列に変換することもできます。
JSON文字列をオブジェクトに変換することをデシリアライズといいます。
Newtonsoft.Jsonは角括弧[]の配列を含むJSON文字列は匿名型オブジェクトにデシリアライズできません。
JSONの配列を匿名型にデシリアイズすると実行時にこのような例外がスローされます。
Newtonsoft.Json.JsonException
匿名型ではなくクラスなら配列をデシリアイズできます。
匿名型の例
クラスの例
匿名型はクラスより字数が少なくメソッドの中で定義できますが、クラスより用途が制限されます。
Azureの新しいポータルではまった
このブログを書いている時点では、最新のAzureポータルからWebジョブの実行をスケジュール設定できません。
Webジョブを定期的に実行するには AzureのレガシーポータルからWebジョブを
スケジュールに従って実行 の設定で展開しなおす必要がありました。
クエリちゃんのMMDモデルを公開中です
クエリちゃんのMMDモデルはOneDriveからダウンロードできます。
クエリちゃんのMMDモデルで動画を作ったらぜひ投稿してください。
関連ブログ
[Azure] クエリちゃんの動画投稿数をツイートするサービス をGitHubに公開するまで
Visual Studio Community 2015 をISOファイルからWindows10にインストールする方法
[Android] Xamarin でアプリを作ってみました
ツイッターAPIの検索で複数の画像URLが取得できない対策方法
Twitterの「このリンクは安全ではない」「このリクエストを保留しています」の対策 2015年版
以上、参考になれば幸いです。