成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在Azure上構建一個基于Facebook的營銷式應用程序(中)

原創
云計算
當你的Facebook應用程序點擊率上升的時候,它如何進行擴展呢?如果你是在Windows Azure上構建的這個應用程序,并且是按橫向擴展的思想設計的這個應用程序,那么很高興地告訴,你可以“高枕無憂”了。

本文接在Azure上構建一個基于Facebook的營銷式應用程序(上) 和

請看下篇《在Azure上構建一個基于Facebook的營銷式應用程序(下)》

在一個Canvas頁面

這個應用程序在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);

}

這看起來十分的簡單,這主要得益于Facebook C# 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”中,以便于我們可以跟蹤將來對這個應用程序的訪問(客戶只可以注冊一次,領取一次獎品)。

#p#

在Azure Storage中存儲“Contact”

在上面那段代碼中,你可能已經注意到了,存儲客戶的Facebook ID的“Contact”屬性叫作“PartitionKey”,而不是“FacebookId”。“Contact”是一個數據模型,這意味著它可以直接存儲到Azure Table Storage中。它繼承于“TableStorageEntity”,對于可存儲的實體來說,“TableStorageEntity”是一個方便的基類,在這個類中,包含了“PartitionKey”屬性和“RowKey”屬性。

“AzureFacebookSample”使用Azure Table Storage,因為在Azure Table Storage中,插入操作和主鍵查詢都很快,而且,它可以無限地擴展。在一個Azure表中,除了這些實體屬性所必須列之外,每行還包括一個partition key,一個row key,和一個時間戳。為了獲得***的性能,查詢應該被嚴格地限制在那些基于主鍵的字段中,不應該包括含他的屬性。

我們把Facebook ID作為partition key,把blank作為row key,然后把“contact”存儲到一個Azure表中。這樣做可以讓存儲的“contact”更容易使用(使用起來也更快),因為我們可以通過Facebook ID來查找或更新它們。

Web角色和Worker角色都可以通過域項目提供的“ContactRepository”來訪問存儲的“contact”對象。通過Windows Azure Toolkit中的一些類,“ContactRepository”可以直接和Azure storage進行交互,這可以讓實現變得更加簡潔。

Listing 4

public class ContactRepository : IContactRepository

{

readonly AzureTable<Contact> _table;

public ContactRepository()

{

var factory = new AzureStorageFactory ();

_table = (AzureTable<Contact>) factory.GetTable<Contact>();

}

public Contact GetFromFacebookId(Int64 facebookId)

{

return this.Get(facebookId.ToString());

}

public Contact Get(string partitionKey)

{

return _table.Get(c => c.PartitionKey == partitionKey && c.RowKey == "");

}

public void Save(Contact contact)

{

_table.AddOrUpdate(contact);

}

public void Delete(Contact contact)

{

_table.Delete(contact);

}

}

這段代碼展示了“ContactRepository”的完整實現。在構造函數中,我們創建了一個“AzureStorageFactory”對象,然后使用“factory”來獲取“Contact”表。“AzureStorageFactory”和“AzureTable”都是在WindowsAzureToolkit中定義的類,這兩個類可以讓使用Azure Table Storage變得更加容易。實際上,這個“contact”容器中的大多數方法都是“AzureTable”中的對應方法的封裝。“Get()”方法直接通過“partition key”來查詢“contact”。

在這個處理程序的***,應用程序使用這個容器把聯系信息寫入到Azure Storage中。因為處理過程還沒有完成,所以這個“contact”還不能標記為已注冊(在選擇了商店以后,才應該這么做)。在索引操作開始的時候,這個“contact”容器還可以用來驗證。

Listing 5

if (AlreadyRegistered(app.UserId))

{

return this.CanvasRedirectToAction("SignupComplete");

}

驗證的實現如下所示:

Listing 6

private bool AlreadyRegistered(Int64 facebookId)

{

Contact contact = contactRepository.GetFromFacebookId(facebookId);

Return (contact != null) && contact.Registered;

}

 

本文接在Azure上構建一個基于Facebook的營銷式應用程序(上)

請看下篇《在Azure上構建一個基于Facebook的營銷式應用程序(下)》

原文名:Building a Facebook Marketing App on Azure 作者:Steve Apiki

【本文乃51CTO精選譯文,轉載請標明出處!】

【編輯推薦】 

  1. 在Azure上構建一個基于Facebook的營銷式應用程序(下)
  2. 在Azure上構建一個基于Facebook的營銷式應用程序(下)
  3. 無需頂禮膜拜 三步打造經濟高效的云基礎架構

 


 

 

 

責任編輯:王勇 來源: 來源:51CTO
相關推薦

2011-03-14 14:47:50

2011-03-14 15:14:10

AzureFacebook營銷式應用程序

2011-11-23 10:06:32

Azure微軟移動應用

2011-03-10 10:45:47

Azure“Hello Worl

2011-03-15 19:45:27

Windows Azu

2011-03-22 09:45:56

Windows AzuSilverlight

2010-11-09 10:37:21

2021-07-14 17:39:46

ReactRails API前端組件

2023-09-21 08:00:00

ChatGPT編程工具

2010-07-12 10:11:27

ibmdwWeb

2023-08-22 20:55:04

AzureLLMTypeChat

2018-12-13 11:10:21

OpenSnitchLinux防火墻

2018-11-14 19:00:24

PythonRedis共享單車

2011-05-11 10:58:39

iOS

2010-01-08 12:14:44

ibmdwAndroid

2021-02-17 11:05:34

PythonPyQt代碼

2015-03-10 09:51:56

云開發云應用程構建PaaS

2011-03-21 14:31:36

Azure應用程序

2015-10-14 10:43:17

PaaSSaaS應用構建

2011-03-22 10:03:55

Windows AzuSilverlight
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人综合一区二区三区 | av av在线| 亚洲日本一区二区 | 国产精品久久久久久久一区探花 | 国产精品777一区二区 | 久久色视频| 亚洲网站在线观看 | 五月天综合影院 | 理论片午午伦夜理片影院 | 免费国产一区二区 | 亚洲精品免费视频 | 成人综合一区二区 | 91精品国产综合久久久动漫日韩 | 九一国产精品 | 蜜臀网| 久久99久久99久久 | 激情五月婷婷在线 | 欧美不卡一区二区三区 | 欧美日韩亚洲视频 | 精品videossex高潮汇编 | 亚洲精品乱 | 亚洲色图综合 | 久久国产精品一区二区三区 | 欧美色图综合网 | 欧美亚洲国产一区 | 国产日韩欧美激情 | 日韩欧美一区二区三区在线播放 | 亚洲啪啪| 婷婷色国产偷v国产偷v小说 | 精品久久久网站 | 日本精品视频在线 | 亚洲精品一区中文字幕乱码 | 亚洲电影中文字幕 | 一区二区三区四区在线 | 日本超碰 | 欧美a在线| 91在线看片 | 99视频在线播放 | 国产一区91在线 | 久久香蕉精品视频 | 亚洲一区二区网站 |