かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

LightSwitch(HTML Client)からASP.NET WebAPIを呼ぶ

まぁ、JavaScriptなんで簡単に呼べますよね。
Global.asaxを作成してApplication_StartにWebAPI用のルートの設定を追加。

RouteTable.Routes.MapHttpRoute(
    "default",
    "api/{controller}/{id}",
    new { id = RouteParameter.Optional });

Controller名前空間あたりに、AuthInfoControllerを作って以下のような内容で作成。とりあえず、ログインユーザー名を返すようにしてみた。LightSwitchが自動生成してくれるServerApplicationContextを使うとデータアクセスとか認証情報へのアクセスとかが出来るのでいい感じ。ASP.NET WebAPIやWebFormやMVCからも使えるので、うまいこと部分的にLightSwitchで作って手を抜きつつ、力を注ぐべきところはWebAPIとMVCで作るとかいう使い分けができるかも?

using System.Web.Http;

namespace LightSwitchApplication.Controller
{
    public class AuthInfoController : ApiController
    {
        // GET api/<controller>
        public string Get()
        {
            using (var context = ServerApplicationContext.Current ?? ServerApplicationContext.CreateContext())
            {
                return context.Application.User.Identity.Name;
            }
        }
    }
}

あとは、ページでAdd Data Item...でString型のLoginUserというプロパティを追加して画面の抵当なところに落としてからWrite Code...からcreatedを選んで生成された関数内にjQueryのajaxメソッドを使ってデータをとってきてから画面のLoginUserに設定してやる。

/// <reference path="../GeneratedArtifacts/viewModel.js" />

myapp.BrowseUsersSet.created = function (screen) {
    // Write code here.
    msls.promiseOperation(function (promise) {
        $.ajax({
            url: "../api/authInfo",
            success: function (result) {
                promise.complete(result);
            },
            error: function (e) {
                promise.error(e);
            }
        });
    }).then(function (result) {
        screen.LoginUser = result;
    });
};

msls.promiseOperationでWinJSのPromiseにラップしてるのは必須なのかは要調査。必須じゃなかったらsuccessのコールバック内で直接screen.LoginUserに代入してもいいもんなぁ。

とまぁ、こんな感じでLightSwitchの認証情報からユーザー名を返すWebAPIを作りつつ、それを画面から呼んで結果を表示するというのは割と簡単にできました。めでたしめでたし。