読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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

LightSwitch JavaScript ASP.NET

まぁ、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を作りつつ、それを画面から呼んで結果を表示するというのは割と簡単にできました。めでたしめでたし。