您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
无责任Windows Azure SDK .NET开发入门(七):Queue Storage服务
 
作者: 王豫翔 来源: CSDN 发布于:2015-10-16
  2713  次浏览      14
 

摘要:无责任Windows Azure SDK .NET开发入门篇,将带来一系列基础文章:从Windows Azure开发前准备工作、使用Azure AD 管理用户信息、创建管理“云”服务、到使用Blob Storage服务等,帮助读者轻易上手使用这套开发工具。

若想回顾Windows Azure SDK .NET开发完整文章,可点击以下链接。而本文将就“使用Queue Storage服务”进行介绍。

Azure 队列存储是一项用于存储大量消息的服务, 用户可以通过经验证的呼叫,使用 HTTP 或 HTTPS 从 世界任何地方访问这些消息。一条队列消息的 大小最多可达 64 KB,一个队列中可以包含数百万条消息,最多可达 存储帐户的总容量限制。存储帐户可以容纳高达 200 TB 的 Blob、队列和表数据。

队列存储的常见用途包括:

  • 创建积压工作以进行异步处理
  • 将消息从 Azure Web 角色传递到 Azure 辅助角色

下面是组件概念图:

在开发前我们需要了解的概念有

  • URL 格式:可使用以下 URL 格式对队列进行寻址: http://<storage account>.queue.core.chinacloudapi.cn/<queue>
  • Storage 帐户:对 Azure 存储空间进行的所有访问都要通过存储帐户完成。
  • 队列:一个队列包含一组消息。所有消息都必须在队列中。
  • 消息:一条消息(不管采用何种格式)的最大大小为 64 KB。

我们需要从NuGet获取WindowsAzure.Storage库,该库的项目地址是:https://www.nuget.org/packages/WindowsAzure.Storage,引用完成后,我们建立本章的控制器:StorageQueueController,该控制器有如下Action

  • Index
  • Create
  • Delete
  • Insert
  • DeQueue
  • Clear

我们的控制器是这样的:

[Authorize]
public class StorageQueueController : Controller
{
CloudStorageAccount storageAccount =
CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("Microsoft.WindowsAzure.Storage"));

CloudQueueClient queueClient = null;

public StorageQueueController()
{
queueClient = storageAccount.CreateCloudQueueClient();
}
}

7.1 Index 列出队列资源

控制器的代码如下:

public ActionResult Index()
{
var queues = queueClient.ListQueues();
return View(queues);
}

对应的View:

@model IEnumerable<Microsoft.WindowsAzure.Storage.Queue.CloudQueue>
@{
ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
@Html.ActionLink("创建新的队列", "Create")
</p>
<table class="table">
<tr>
<th>Name</th>
<th>StorageUri</th>
<th>消息数量</th>
</tr>

@foreach (var item in Model)
{
<tr>
<td>
@Html.ActionLink(@item.Name, "DeQueue", new { name = item.Name })
</td>
<td>@item.StorageUri</td>
<td>
@{
item.FetchAttributes();
}
@item.ApproximateMessageCount
</td>

<td>
@Html.ActionLink("插入消息", "Insert", new { name = item.Name }) |
@Html.ActionLink("删除", "Delete", new { name = item.Name })
</td>
</tr>
}

</table>

运行的结果如图:

7.2 Create创建队列

控制器的代码很简单:

<span style="font-weight: normal;">[HttpPost]
public ActionResult Create(string name)
{
CloudQueue queue = queueClient.GetQueueReference(name);
queue.CreateIfNotExists();
return RedirectToAction("Index");
}</span>

对应的View为:

<span style="font-weight: normal;">
@{ ViewBag.Title = "Create";
}
<h2>Create</h2>

@using (Html.BeginForm())
{
@Html.AntiForgeryToken()

<div class="form-horizontal">
<h4>CloudTable</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
@Html.Label("队列名称")
@Html.TextBox("name")
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}

<div>
@Html.ActionLink("Back to List", "Index")
</div></span>

运行结果如图:

创建成功后跳转到Index页面:

7.3 Delete删除队列

删除队列的控制器非常简单。

public ActionResult Delete(string name)
{
queueClient.GetQueueReference(name).Delete();
return RedirectToAction("Index");
}

7.4 Insert 插入消息

控制器的代码比较明确。

[HttpPost]
public ActionResult Insert(string name, int count)
{
CloudQueue queue = queueClient.GetQueueReference(name);
for (var i = 0; i <= count; i++)
{
var msg = new CloudQueueMessage(Guid.NewGuid().ToString(), string.Format("{0}.{1}", name, DateTime.Now));
msg.SetMessageContent(string.Format("StorageQueueController:{0}", DateTime.Now.Ticks));

queue.AddMessage(msg, timeToLive: new TimeSpan(3, 0, 0));
}

return RedirectToAction("DeQueue", new { name = name });
}

实例CloudQueueMessage后我们可以添加消息正文以描述更多信息。

消息插入成功后会跳转到消息获取的页面:

7.5 DeQueue 消息获取

消息获取采用jQuery的Ajax来操作,控制器为:

public ActionResult DeQueue(string name)
{
ViewBag.Name = name;

return View();
}

对应的View中注意我们采用Ajax的方式或许队列信息,并将得到的信息动态添加到Table中。

@{
ViewBag.Title = "DeQueue";
}

<h2>DeQueue</h2>

@section scripts{
<script>
$(function () {
$("#getmessage").click(function () {
$.ajax(
{
method: "POST",
url: "@Url.Action("GetMessage", "StorageQueue")",
data:{name:"@ViewBag.Name"}
}).done(function(msg){
var trhtml = "<tr><td>" + msg.Id + "</td><td>" + msg.AsString + "</td><td>"
+ msg.ExpirationTime + "</td><td>" + msg.DequeueCount + "</td></tr>";
$("tbody tr:last").after(trhtml);
});
});
})
</script>
}


<h2>@ViewBag.Path</h2>

@Html.Label("消息禁止周期,0表示立即删除")
@Html.TextBox("count", 10, new { id = "count" })
<input type="button" value="获取消息" id="getmessage" />
<table class="table">
<tr>
<th>消息ID</th>
<th>消息正文</th>
<th>到期时间</th>
<th>移除次数</th>
</tr>
<tbody></tbody>
</table>

我们的Ajax代码如下:

[HttpPost]
public JsonResult GetMessage(string name)
{
CloudQueue queue = queueClient.GetQueueReference(name);
CloudQueueMessage retrievedMessage = queue.GetMessage();
queue.DeleteMessage(retrievedMessage);

return Json(retrievedMessage);
}

运行的图为:

7.6 Clear清除消息

代码非常简单,就这样吧。

public ActionResult Clear(string name)
{
queueClient.GetQueueReference(name).Clear();

return RedirectToAction("Index");
}

作者简介

王豫翔,上海致胜信息技术有限公司开发部经理,微软最有价值专家(Microsoft MVP)。曾在各种类型企业做编程技术工作,从代码工人到架构设计,从CS到BS,从静态语言到动态语言,从企业应用到移动互联网。最近3年主持实施了多个大型BI项目和Azure项目。

   
2713 次浏览       14
 
相关文章

深度解析:清理烂代码
如何编写出拥抱变化的代码
重构-使代码更简洁优美
团队项目开发"编码规范"系列文章
 
相关文档

重构-改善既有代码的设计
软件重构v2
代码整洁之道
高质量编程规范
 
相关课程

基于HTML5客户端、Web端的应用开发
HTML 5+CSS 开发
嵌入式C高质量编程
C++高级编程
最新课程计划
信息架构建模(基于UML+EA)3-21[北京]
软件架构设计师 3-21[北京]
图数据库与知识图谱 3-25[北京]
业务架构设计 4-11[北京]
SysML和EA系统设计与建模 4-22[北京]
DoDAF规范、模型与实例 5-23[北京]

使用decj简化Web前端开发
Web开发框架形成之旅
更有效率的使用Visual Studio
MVP+WCF+三层结构搭建框架
ASP.NET运行机制浅析【图解】
编写更好的C#代码
10个Visual Studio开发调试技巧
更多...   

.NET框架与分布式应用架构设计
.NET & WPF & WCF应用开发
UML&.Net架构设计
COM组件开发
.Net应用开发
InstallShield

日照港 .NET Framework & WCF应用开发
神华信息 .NET单元测试
北京 .Net应用软件系统架构
台达电子 .NET程序设计与开发
赛门铁克 C#与.NET架构设计
广东核电 .Net应用系统架构
更多...