本文接如何将基于Facebook营销式应用程序创建在Azure
基于Facebook营销式应用程序在Canvas页面上,会映射到这个应用程序。在Azure上的base URL(例如:http://azurefacebooksample.cloudapp.net/)这是一个展示初始的联系信息的窗体。下面就是如何展示联系信息的步骤:
Listing 1
[CanvasAuthorize(Perms = "user_birthday")]
public ActionResult Index()
{
FacebookApp app = new FacebookApp();
dynamic response = app.Api("me");
Contact contact = new Contact();
contact.FirstName = response.first_name;
contact.LastName = response.last_name;
string query = "select birthday_date from user where uid = me()";
response = app.Fql(query);
if (response.Count > 0)
contact.DateOfBirth = response[0].birthday_date;
return View(contact);
}
这个程序已经相对的得到简便,这主要得益于FacebookC# SDK。这个SDK通过“CanvasAuthorize”特性处理了Facebook OAuth身份验证和应用程序的授权,并且提供了一个“FacebookApp”对象。你应该还记得,在一个新用户运行“AzureSample”以前,他们必须要给这个应用程序授予可以访问这个用户的出生日期的特殊权限。为了达到这个目的,我们需要做的所有事情就是,使用“CanvasAuthorize”特性,对任何一个需要授权的控制器操作进行标记,指定需要请求的扩展权限是可选的(在这里,我们指定了“user_birthday”权限)。
“FacebookApp”对象可以访问经过签名的请求信息,也可以访问Facebook的Graph API和REST API。在这个控制器中,我们使用“FacebookApp”调用一个Graph API(“me”),来返回当前用户的信息(其中包括第一个名字和最后一个名字)。我们不能使用这个Graph API来获取这个用户的出生日期,但是,我们可以求助于Facebook FQL,创建一个查询来找到当前用户的出生日期。我们可以通过“FacebookApp”来使用FQL(Formal Query Language) 。我们把这个用户的信息添加到一个新的“Contact”对象中,这是一个来自于域对象的数据模型对象。然后,我们把这个“contact”放到一个视图中。
这是这个索引视图的完整代码:
Listing 2
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<AzureFacebookSample.Domain.Models.Contact>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Home
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<div>Please provide the following information. All fields are required.</div>
<% using (Html.BeginForm())
{%>
<%: Html.ValidationSummary(true)%>
<div class="editor-label">
<%: Html.LabelFor(model => model.FirstName)%>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.FirstName)%>
<%: Html.ValidationMessageFor(model => model.FirstName)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.LastName)%>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.LastName)%>
<%: Html.ValidationMessageFor(model => model.LastName)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Email)%>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Email)%>
<%: Html.ValidationMessageFor(model => model.Email)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.DateOfBirth)%>
</div>
<div class="editor-field">
<%: Html.EditorFor(model => model.DateOfBirth)%>
<%: Html.ValidationMessageFor(model => model.DateOfBirth)%>
</div>
<div>You must be 18 or older to participate.</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Zip)%>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Zip)%>
<%: Html.ValidationMessageFor(model => model.Zip)%>
</div>
<p>
<input type="submit" value="Next"/>
</p>
<%} %>
</aspContent>
这个视图指定了用于收集联系信息的窗体字段。验证是通过“Contact”数据模型上的特定注解来实现的。当用户点击“next”按钮的时候,这些窗体字段会被发送到控制器的post操作中:
Listing 3
[HttpPost]
[CanvasAuthorize]
Public ActionResult Index(Contact contact)
{
FacebookApp app = new FacebookApp();
contact.PartitionKey = app.UserId.ToString();
if (ModelState.IsValid)
{
contactRepository.Save(contact);
return this.CanvasRedirectToAction("SelectStore");
}
Return View(contact);
}
除了从窗体返回的联系信息之外,我们还会通过“FacebookApp”对象来抓取用户的Facebook ID,然后放到“Contact”中,以便于我们可以跟踪将来对这个应用程序的访问(客户只可以注册一次,领取一次奖品)。