CourseLearner:基于 Azure 的电子学习产品





5.00/5 (10投票s)
基于 Azure 的电子学习产品。
免责声明
本文是为 CodeProject - Windows Azure 挑战赛发布 https://codeproject.org.cn/Competitions/637/Windows-Azure-Developer-Contest.aspx。本产品、源代码等任何部分不属于我工作的组织。作为本文一部分上传的源代码是为比赛而实现的实际系统的进行中版本。
Windows Azure 挑战赛
网站 URL: http://courselearnernew.azurewebsites.net/
用户名: demouser
密码: demouser
- 挑战 1 - 首次挑战:入门。 4月15日 - 5月3日
- 挑战 2 - 构建网站。 4月29日 - 5月12日
- 挑战 3 - Windows Azure SQL。 5月13日-5月26日
- 挑战 4 - Windows Azure 虚拟机。 5月27日-6月9日
引言
本文将讨论电子学习产品“CourseLearner”的设计和实现,该产品利用 Windows Azure 并充分发挥其技术栈的优势。
许多教育机构缺乏运行顶级电子学习解决方案所需的资源和基础设施。如今,电子学习已广泛应用于不同教育层面:继续教育、公司培训、学术课程等。
Windows Azure 为我们提供了什么
- Azure 减少了对前期技术采购的需求,并使开发人员能够使用其现有的 Microsoft Visual Studio 开发环境和 Microsoft .NET Framework 技能,快速轻松地创建在云中运行的应用程序。
- 基础设施管理已通过一个专为高可用性和动态扩展而设计的平台实现自动化,以匹配使用需求,并提供按使用量付费的定价模式。
- Azure 提供了一个开放、基于标准且可互操作的环境,支持多种 Internet 协议,包括 HTTP、REST、SOAP 和 XML。
- 通过 TFS、GitHub 持续部署到 Windows Azure 网站。
为什么选择 Windows Azure?
- 99.9% SLA,支持各种技术栈(.net、node.js、Php)
- 最近的调查显示 Azure 在性能和可扩展性方面表现最佳。
它如何帮助 CourseLearner
- 基础设施:在提供商的基础设施上使用 CourseLearner。
- 集中式数据存储
实现细节
挑战 1:创建网站
Azure 是一个运行在 Microsoft 数据中心的互联网规模云服务平台,它提供了一个操作系统和一组开发人员服务,可以单独或组合使用。
基于以上功能,我们可以为 CourseLearner 选择 Web 开发技术栈。
- ASP.NET MVC4:MVC 模式,用于处理来自客户端的请求和响应。
- ASP.NET WebAPI:通过 WebAPI 统一服务,可以更灵活地处理 CourseLearner 和各种客户端(移动、桌面应用)的 API 调用。
CourseLearner 工作流程
CourseLearner 的功能
- 提供课程相关材料(主题、视频)
- 课程讨论区
- 完成课程章节后的声誉/徽章
- 通过响应式设计实现移动用户友好。
挑战 2:SQL Azure
SQL Azure 提供以下功能,这些功能对于 CourseLearner 的实现更加健壮。
- 可管理性:具有企业数据中心的规模和功能,而无需与本地 SQL Server 实例相关的管理开销。
- 高可用性:SQL Azure 承诺 99.9% 的 SLA。
挑战 3:Azure 移动服务
推送通知在移动应用程序中起着重要作用,我们可以在许多用例中使用推送通知,如下所示。
- 在创建新课程时发送通知非常有用。
- 学生完成课程时发送通知/消息非常有用。
挑战 2:构建网站
什么是响应式网页设计?
响应式网页设计是一种设置,其中服务器始终向所有设备发送相同的 HTML 代码,并使用 CSS 通过媒体查询来更改页面在设备上的呈现方式。
- 它是一种方法,它表明设计和开发应根据屏幕尺寸、平台和方向来响应用户行为和环境。
- 当用户从笔记本电脑切换到 iPad 时,网站应自动切换以适应分辨率、图像大小和脚本能力。
我们为什么需要响应式网页设计?
- 采用响应式网页设计设计的网站通过使用流式、基于比例的网格、灵活的图像和 CSS3 媒体查询来适应浏览环境。
- 用户无需重定向即可获得设备优化的视图,从而减少加载时间。此外,基于用户代理的重定向容易出错,并可能降低您网站的用户体验。
- 一个在所有设备和屏幕尺寸上都能很好地工作的网站。
我们如何实现?
在实现响应式网站之前,让我们谈谈 Web 的基本知识,移动浏览器如何代表您工作以在较小的屏幕上优化页面。
- 什么是视口?
在移动浏览器上测试媒体查询时,您可能会注意到正确的媒体查询实际上并未应用。发生这种情况时,移动浏览器会为您执行一些工作,以在较小的屏幕上优化页面。
viewport meta 标签控制移动浏览器(无浏览器边框)窗口的逻辑尺寸和缩放。将宽度设置为 device-width 可以解决此问题。
一个典型的移动优化网站包含以下内容:
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
width 属性控制视口的大小。它可以设置为特定像素数(如 width=600)或特殊值 device-width,即屏幕在 CSS 像素中的宽度,缩放比例为 100%。
initial-scale 属性控制页面首次加载时的缩放级别。maximum-scale、minimum-scale 和 user-scalable 属性控制用户被允许放大或缩小页面的方式。
2. 图像/视频元素可以与响应式设计一起使用吗?
是的。您可以使图像也具有响应性。WHATWG 提出了响应式图像的新语法。
<picture alt="The alt attribute’s content should accurately describe the image
represented by all sources, though cropping and zooming of sources may differ.">
<!-- Matches by default: -->
<source src="mobile.jpg" />
<!-- Overrides the previous source for windows greater than 600px -->
<source src="medium.jpg" media="min-width: 600px" />
<!-- Overrides the previous source for windows greater than 900px -->
<source src="fullsize.jpg" media="min-width: 900px" />
<!-- Fallback content, only displayed in the event the
<picture> tag is unsupported by the browser: -->
<img src="mobile.jpg" />
</picture>
或者您可以选择旧的 CSS 技巧来实现结果。
img {
<span class="code-none"><span class="code-none"><span class="code-none"><span class="code-none">: pre<span class="code-none"><span class="code-none"><span class="code-none"><span class="code-none"><span class="code-none">;</</</span>
3. 标准设备的媒体查询
/* Smartphones (portrait and landscape) ----------- */
@media only screen
and (min-device-width : 320px)
and (max-device-width : 480px) {
/* Styles */
}
/* Smartphones (landscape) ----------- */
@media only screen
and (min-width : 321px) {
/* Styles */
}
/* Smartphones (portrait) ----------- */
@media only screen
and (max-width : 320px) {
/* Styles */
}
/* iPads (portrait and landscape) ----------- */
@media only screen
and (min-device-width : 768px)
and (max-device-width : 1024px) {
/* Styles */
}
/* iPads (landscape) ----------- */
@media only screen
and (min-device-width : 768px)
and (max-device-width : 1024px)
and (orientation : landscape) {
/* Styles */
}
/* iPads (portrait) ----------- */
@media only screen
and (min-device-width : 768px)
and (max-device-width : 1024px)
and (orientation : portrait) {
/* Styles */
}
/* Desktops and laptops ----------- */
@media only screen
and (min-width : 1224px) {
/* Styles */
}
/* Large screens ----------- */
@media only screen
and (min-width : 1824px) {
/* Styles */
}
/* iPhone 4 ----------- */
@media
only screen and (-webkit-min-device-pixel-ratio : 1.5),
only screen and (min-device-pixel-ratio : 1.5) {
/* Styles */
}
编码
网站采用 Twitter Bootstrap 设计,以提供移动用户的响应式设计。
1. _layout.cshtml
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>@ViewBag.Title - My ASP.NET MVC Application</title>
<link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
<meta name="viewport" content="width=device-width" />
@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="container-fluid">
<button type="button" class="btn btn-navbar"
data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar">
<span class="icon-bar">
<span class="icon-bar">
</button>
<a class="brand" href="#">CourseLearner</a>
<div class="nav-collapse collapse">
<p class="navbar-text pull-right">
Logged in as <a href="#" class="navbar-link">Username</a>
</p>
<ul class="nav">
<li class="active"><a href="#">Home</a></li>
<li><a href="#about">Create Course</a></li>
<li><a href="#contact">MySetting</a></li>
</ul>
</div>
<!--/.nav-collapse -->
</div>
</div>
</div>
<div class="container-fluid">
<div class="row-fluid">
@RenderBody()
</div>
<!--/row-->
<hr>
<footer>
<p>© Company 2013</p>
</footer>
</div>
@Scripts.Render("~/bundles/jquery")
@RenderSection("scripts", required: false)
</body>
</html>
原型
- 首页
- 创建新课程
- 将视频或课程材料附加到选定的课程
网站预览
- 响应式网站:正如我上面提到的,我正在使用 Twitter Bootstrap 框架来获得网站的响应性。
课程创建页面
向课程添加视频
为所选课程添加视频对我来说有些挑战,因为我需要接受 MP4 的视频格式。经过大量研究,我找到了 MediaHandler 工具来将给定的视频编码为 MP4。它使用 ffmpeg 库来编码视频。这是将视频转换为 mp4 格式的代码。
public class VideoEncoder
{
private MediaHandler _mhandler;
private string RootPath;
private VideoInfo objVideoInfo;
public VideoEncoder()
{
_mhandler=new MediaHandler();
RootPath = HttpContext.Current.Server.MapPath(
HttpContext.Current.Request.ApplicationPath);
_mhandler.FFMPEGPath =
HttpContext.Current.Server.MapPath("~\\MediaTools\\ffmpeg.exe");
}
public VideoInfo EncodeVideo(string guid,string filename)
{
objVideoInfo = new VideoInfo();
_mhandler.InputPath = RootPath + @"VideoFiles\";
_mhandler.OutputPath = RootPath + @"VideoFiles\";
_mhandler.FileName = guid;
_mhandler.OutputFileName = guid;
_mhandler.OutputExtension = ".mp4";
_mhandler.Force = "mp4";
_mhandler.Width = 640;
_mhandler.Height = 380;
_mhandler.Video_Bitrate = 500;
_mhandler.Audio_SamplingRate = 44100;
_mhandler.Audio_Bitrate = 128;
objVideoInfo = _mhandler.Encode_MP4();
return objVideoInfo;
}
}
视频预览:视频预览完全通过 HTML5 视频功能实现,并支持回退。
<!-- first try HTML5 playback: if serving as XML, expand `controls` to `controls="controls"` and autoplay likewise -->
<!-- warning: playback does not work on iOS3 if you include the poster attribute! fixed in iOS4.0 -->
<video width="640" height="360" controls>
<!-- MP4 must be first for iPad! -->
<source src="__VIDEO__.MP4" type="video/mp4" /><!-- Safari / iOS video -->
<source src="__VIDEO__.OGV" type="video/ogg" /><!-- Firefox / Opera / Chrome10 -->
<!-- fallback to Flash: -->
<object width="640" height="360" type="application/x-shockwave-flash" data="__FLASH__.SWF">
<!-- Firefox uses the `data` attribute above, IE/Safari uses the param below -->
<param name="movie" value="__FLASH__.SWF" />
<param name="flashvars" value="controlbar=over&image=__POSTER__.JPG&file=__VIDEO__.MP4" />
<!-- fallback image. note the title field below, put the title of the video there -->
<img src="__VIDEO__.JPG" width="640" height="360" alt="__TITLE__"
title="No video playback capabilities, please download the video below" />
</object>
</video>
我在 Azure 中查看 mp4 视频时遇到了麻烦。Azure 没有为 mp4 类型的文件设置响应头。有一个变通方法可以解决这个问题。只需在 system.webServer
标签中添加这些行。
<system.webServer>
<staticContent>
<mimeMap fileExtension=".mp4" mimeType="video/mp4"/>
<mimeMap fileExtension=".ogv" mimeType="video/ogg"/>
<mimeMap fileExtension=".webm" mimeType="video/webm"/>
</staticContent>
</system.webServer>
检查响应性的在线工具
复活节彩蛋挑战
复活节彩蛋 - 作为隐藏功能,会出于各种原因而留下。有些是为了让项目更具个人特色,有些则是作为一种创造性的方式来展示纯功能性软件。
这是 CourseLearner 的复活节彩蛋
- 转到首页 -> 然后点击“了解工作原理”链接即可看到复活节彩蛋。
- 显示带有动画的复活节彩蛋以及 Windows Azure 标志。
- 用锤子打破彩蛋并听破碎的声音,金色的复活节彩蛋包含 Bob 的标志。
- Bob 以打字机模式欢迎您参加挑战。
我如何实现的
整个复活节彩蛋挑战完全使用 CSS 代码完成,甚至包括彩蛋形状和动画。我试图利用 HTML5/CSS3 的原生功能,而不是依赖第三方库。
复活节彩蛋挑战中使用的 HTML5/CSS3 功能
- @Keyframes 用于动画。
- HTML 5 音频元素:用于在彩蛋破碎时播放声音。
- CSS3 功能:border-radius、box-shadow、tranition、rotate。
@keyframes:在 CSS3 中提供动画
要使用关键帧,您需要创建一个名为 @keyframes 的规则,然后使用 animation-name 属性将动画与其关键帧列表匹配。每个 @keyframes 规则都包含一个由关键帧选择器组成的样式列表,每个选择器都由关键帧发生的动画百分比以及一个包含该关键帧样式信息的块组成。
用于移动彩蛋和 Windows Azure 标志
@@-webkit-keyframes mike-move {
100% {
left: 12%;
}
}
@@-webkit-keyframes mike-float {
50% {
-webkit-transform: rotateZ(5deg) translateY(-5px);
}
}
使用 CSS3 创建复活节彩蛋形状
#verti-egg {
background-color: rgb(255, 133, 0);
width: 105px;
height: 180px;
margin: 4px 4px 1px 100px;
-webkit-border-radius: 50%/60% 60% 40% 40%;
-moz-border-radius: 50%/60% 60% 40% 40%;
border-radius: 50%/60% 60% 40% 40%;
-webkit-box-shadow: 0px 0px 20px #D5D3D3, 0px 0px 20px #D5D3D3;
-moz-box-shadow: 0px 0px 20px #D5D3D3, 0px 0px 20px #D5D3D3;
box-shadow: 2px 3px 21px #D5D3D3, 0px 0px 20px #D5D3D3;
cursor: url(../../Images/hammer.png) 0 0, auto;
}
实现打字机效果:我扩展了 jQuery 插件,为 Windows Azure 欢迎文本提供打字机效果。
$.fn.typeWriter = function (opts) {
var $this = this,
defaults = {
animDelay: 50
},
settings = $.extend(defaults, opts);
$.each(settings.text.split(''), function (i, letter) {
setTimeout(function () {
$this.html($this.html() + letter);
}, settings.animDelay * i);
});
};
$('#welcomeMsg').typeWriter({
animDelay: 100, // the bigger the number the slower the typing
text: 'Welcome to Azure Developer Challenge with An Easter Egg!!'
});
Windows Azure 提供的部署选项
Windows 提供了许多将应用程序部署到云的选项。
- 通过门户进行 Web 部署
- 通过 Visual Studio 工具进行 Web 部署,以进行发布、管理(Azure SDK 2.0)。
- 通过 FTP(文件传输协议)进行部署
- 通过 PowerShell 命令
- 通过源代码管理(TFS、GitHub、持续集成服务器)
通过门户进行 Web 部署:
- 登录 Windows Azure Portal,您可以根据 Windows Azure 提供的模板(WordPress、Joomla,或创建快速网站)创建网站。
- 然后转到新创建网站的仪表板。在那里,您可以下载发布配置文件和其他额外信息。
下载完成后,打开 Visual Studio,右键单击您的网站项目,然后选择发布。
现在您可以验证连接。
单击发布按钮,网站发布将开始。发布过程完成后,您的网站将在 Azure 云中运行。
通过 Visual Studio 工具进行 Web 部署,以进行发布、管理(Azure SDK 2.0)。
Windows Azure 团队最近发布了 Windows Azure .NET SDK 的 v2.0 更新。这些新功能包括:
- 网站:用于发布、管理和诊断的 Visual Studio 工具更新。
- 云服务:支持新的高内存 VM 大小、更快的云服务发布和用于配置和查看诊断数据的 Visual Studio 工具。
- 存储:Storage Client 2.0 现在包含在新项目中,并且 Visual Studio Server Explorer 现在支持使用存储表。
- 服务总线:更新了客户端库,支持消息泵编程模型、浏览消息以及自动删除空闲消息实体。
- PowerShell 自动化:更新了对 PowerShell 3.0 的支持,以及大量用于自动化网站、云服务、VM 等的 PowerShell 命令。
安装 Windows Azure SDK 2.0。可以从 Windows Azure 网站下载 http://www.windowsazure.com/en-us/develop/net。
Windows Azure SDK 包含以下工具:
- Windows Azure 计算模拟器 – 一个本地模拟云服务运行环境的工具。
- Windows Azure 存储模拟器 – 一个本地模拟 Windows Azure 存储服务的工具。
- CSPack – 一个创建可部署到 Windows Azure 的应用程序包的工具。
- CSUpload – 用于将 VHD 文件和服务器证书上传到 Windows Azure 的工具。
- CSEncrypt – 用于加密远程桌面连接密码的工具。
- CSRun – 用于使用适当的应用程序包启动计算模拟器的工具。
- DSinit - 在本地环境中初始化 Windows Azure 存储模拟器。
使用 Windows Azure SDK 2.0 发布/管理 Windows Azure 网站的步骤
- 打开 Visual Studio。单击服务器资源管理器窗口。右键单击 Windows Azure 网站 -> 单击导入订阅 -> 提供您的发布订阅。
连接到 Windows Azure 后,您可以停止/更改 Azure 站点的设置,甚至可以查看日志。
3. 通过 FTP(文件传输协议)进行部署
Windows Azure 提供 FTP 端点,您可以通过该端点轻松更新文件。您可以使用 Windows 资源管理器来使用 FTP,或者使用 FileZilla 等 FTP 客户端。
- 登录 Windows Azure Portal。转到仪表板。
仪表板提供 Windows Azure 的所有重要信息。
- 它包括网站使用情况概览。
- CPU 时间
- 硬盘使用情况等。
- 转到 FTP 主机名:单击链接以连接到站点,网站会提示您输入 Windows Azure 网站的用户名和密码。您可以在发布配置文件中看到这些信息。
<publishData>
<publishProfile profileName="CourseLearner - Web Deploy" publishMethod="MSDeploy"
publishUrl="waws-prod-ch1-001.publish.azurewebsites.windows.net:443"
msdeploySite="CourseLearner" userName="$CourseLearner"
userPWD="" destinationAppUrl="http://courselearner.azurewebsites.net"
SQLServerDBConnectionString=""
mySQLDBConnectionString="" hostingProviderForumLink=""
controlPanelLink="http://windows.azure.com"><databases/>
</publishProfile>
<publishProfile profileName="CourseLearner - FTP" publishMethod="FTP"
publishUrl="ftp://waws-prod-ch1-001.ftp.azurewebsites.windows.net/site/wwwroot"
ftpPassiveMode="True" userName="CourseLearner\$CourseLearner"
userPWD="PasswordWillBehere" destinationAppUrl="http://courselearner.azurewebsites.net"
SQLServerDBConnectionString="" mySQLDBConnectionString="" hostingProviderForumLink=""
controlPanelLink="http://windows.azure.com"><databases/>
</publishProfile>
</publishData>
4. 通过 Windows Azure PowerShell 命令
Windows Azure PowerShell 是一个 Windows PowerShell 模块,可用于控制和自动化 Windows Azure 中工作负载的部署和管理。
要使用 PowerShell 命令,您需要安装 Windows Azure 管理 cmdlet。 http://msdn.microsoft.com/en-us/library/windowsazure/jj152841
一些有助于您开始使用 PowerShell cmdlet 的命令。
免责声明:我完全不是 PowerShell 专家,所以可能存在更好的方法来完成我展示的内容。
- Get-AzureWebsite : 获取与当前订阅关联的 Windows Azure 中网站的信息。
- New-AzureWebsite : 在 Windows Azure 中创建一个新网站来运行。
- Remove-AzureWebsite:从 Windows Azure 中删除指定的网站。
- Restart-AzureWebsite : 停止然后重新启动指定的网站。
PowerShell cmdlet 将对象写入(或应该写入)管道。您可以将两个命令组合在一个管道中。
例如: 将两个 PowerShell 命令与管道组合。
Get-AzureWebsite | Stop-AzureWebsite
- 检索所有网站,这将返回一个 Site 对象集合。每个对象都是一个摘要对象,它有一个 Name 属性,即站点名称。
- 管道到 Stop-AzureWebsite(将 Site.Name 匹配到 Stop-AzureWebsite Name 参数),这将停止每个站点。
扩展网站以提高性能
我们如何扩展网站。
Windows Azure 提供三种模式供您运行网站。
- 免费模式 : 当网站首次创建时,它在免费网站模式下运行,这意味着它与其他也运行免费或共享网站模式的订户共享可用的计算资源。所有网站都在多租户环境中运行,并有 CPU、内存和网络资源使用配额。配置为免费模式的网站的单个实例的性能将比其他配置略有下降,但仍应提供足够的性能来完成开发任务或概念验证工作。
- 共享模式 : 配置为或更新为共享模式的网站使用低成本扩展模式,该模式提供比免费模式更高的性能。在管理门户的“Scale”选项卡中可以轻松更改为共享模式。这些更改只需几秒钟即可应用,并且不需要更改代码或重新部署应用程序。共享模式比免费模式使用更严格的资源使用配额。您可以在免费模式下运行的网站的最大数量可能因您的计划而异。
- 保留网站模式:配置为保留的网站将提供比配置为免费或共享的网站更一致的性能。 当您将网站配置为保留时,您需要指定网站的大小(小、中或大)。配置了较大保留实例大小的网站在负载下性能会更好。您还需为保留实例计数(1 到 3)指定一个值。增加保留实例计数将通过横向扩展来提供容错能力和改进的性能。
- 您可以在配置选项卡中为应用程序配置 .net 框架。
- 您可以将网站扩展到 3 种模式(免费、共享、保留)以及网站的实例计数。
如何利用 10 个免费的 Azure 网站?
在 Azure 中创建网站可能需要一分钟。您可以创建多达 10 个小型网站(*每个区域)以供免费玩耍和实验,甚至可以预留实例并根据您的需求扩展网站。
*10 个免费网站配额按子区域计算。所以 Windows Azure 提供 4 个区域。所以 10 个网站 X 4 个区域 = 40 个网站。 如果您的一个或多个网站使用了超过给定资源的允许配额,您可能会遇到服务暂时中断。 您可以了解有关免费网站的更多信息。 https://www.windowsazure.com/en-us/pricing/details/web-sites/
利用 Azure 提供的免费网站的优势
- 巨大的学习机会,这让我更加高兴。现在我有 10 个免费的站点可以玩 Node JS、PHP 或其他语言,甚至可以为每个站点尝试新的 Azure 功能(SQL AZURE(表存储、Blob)、媒体服务、移动服务)。
- 可以使用多种方式进行发布,使用 Web Deploy、TFS、Git 或 FTP,甚至可以在门户中管理所有内容,或者通过 PowerShell Cmdlet 从命令行自动化。这给了我许多新的方法来快速发布站点并学习事物。
- 您可以创建一个用于测试负载均衡、虚拟机的沙盒,或者配置站点的自定义域。 http://www.windowsazure.com/en-us/develop/net/common-tasks/custom-dns-web-site/
- Azure 提供应用程序库,用于在 Windows Azure 平台(包括公共云和私有云)上探索、发现和安装流行的社区 ASP.Net 和 PHP 应用程序。
- 用户可以浏览和查看不同类型的网站应用程序,从照片库到博客再到电子商务网站。
- WordPress、JOOMLA、NodeJS 或许多其他流行应用程序都可以在几次点击中创建。
我将演示如何在 Windows Azure 中在一分钟内创建一个新的 WordPress 网站。相同的方法可用于创建 Windows Azure 应用程序库中提供的其他类型的网站。
- 登录 Windows Azure Portal,单击“创建新”按钮,然后选择“网站”->“从库”。单击“从库”以探索在 Azure 中创建网站的可能方式。
2. 您可以浏览和查看不同类型的网站应用程序,从照片库到博客再到电子商务网站。 在此演示中,我选择一个 WordPress 网站。 然后单击“下一步”按钮继续执行后续步骤。
3. Azure 会提示您为 Word Press 网站(MySQL 数据库名称、区域)进行配置。选择选项后,单击“下一步”按钮继续执行后续步骤。
4. 确认设置并单击“下一步”即可在一分钟内创建新的 WordPress 网站。 新创建的站点将列在网站部分。
10 个免费 Azure 网站的结果
- 学会了许多新的将网站发布到云的方式。
- 您不必成为 ASP.NET/PHP/Joomla 或 Azure 提供的其他语言的专家,即可创建网站。只需几次点击即可完成。
此网站如何适应下一个挑战。
目前网站将视频文件存储在同一个文件夹中。在接下来的挑战中,我计划使用 Azure 存储来存储 Blob 内容和媒体服务。
Windows Azure Blob 存储
是一项用于存储大量非结构化数据,可以从世界任何地方通过 HTTP 或 HTTPS 访问的服务。单个 Blob 的大小可达数百 GB,单个存储帐户可包含多达 100 TB 的 Blob。Blob 存储的常见用途包括:
- 直接向浏览器提供图像或文档
- 存储用于分布式访问的文件
- 流式传输视频和音频
- 执行安全备份和灾难恢复
- 存储供本地或 Windows Azure 托管服务分析的数据
- 您可以使用 Blob 存储将数据公开给全世界,或私有化以供内部应用程序存储。
// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");
// Retrieve reference to a blob named "myblob".
CloudBlockBlob blockBlob = container.GetBlockBlobReference("myblob");
// Create or overwrite the "myblob" blob with contents from a local file.
using (var fileStream = System.IO.File.OpenRead(@"path\myfile"))
{
blockBlob.UploadFromStream(fileStream);
}
挑战 3: Windows Azure SQL
Azure 提供以下功能来管理云中的数据。
- SQL 数据库: 一项托管的关系数据服务。此选项属于平台即服务(PaaS)类别,这意味着 Microsoft 负责管理其机制——您无需管理数据库软件或运行它的硬件。
- VM 中的 SQL Server: 使用 Windows Azure 虚拟机创建的虚拟机。此方法允许您使用 SQL Server 的所有功能,包括 SQL 数据库未提供的功能,但这也要求您承担更多数据库服务器及其运行的 VM 的管理工作。
- Azure 存储服务 :
-
- Blob 存储: 存储非结构化字节集合。Blob 可以处理大量的非结构化数据,如视频,它们也可以用于存储较小的数据项。
- 表存储: 提供 NoSQL 键/值存储。表提供对大量松散结构化数据的快速、简单访问。但是,不要感到困惑:尽管有其名称,表存储并不提供关系表。
-
- SQL Server 报表: 提供多种编程接口,您可以在自己的应用程序中利用这些接口。
SQL Azure 的优势
- 高可用性:SQL Azure 维护数据库的三份副本,因此您将始终能够获取数据。
- 按需:SQL Azure 可以提供按需功能。
- 管理开销少:作为 SQL Azure 服务的一部分进行数据库的物理管理。最终用户无需安装、更新或修补任何软件。此外,正如您所想象的,这减少了最终用户的管理开销。
- Windows Azure SQL : SQL 数据库为 Windows Azure 提供了一个关系数据库管理系统,并基于 SQL Server 技术。您可以使用 SqlConnection 类轻松地与之进行交互。
如上图所示,Azure 在多租户系统上运行。
如何在我们的应用程序中使用它。
- 登录 Windows Azure Portal 并创建一个数据库。
2. 然后选择新创建的数据库,然后单击“显示连接字符串”。
<connectionStrings>
<add name="ConnectionString"
connectionString ="Server=tcp:xxxxxxxxxx.database.windows.net;Database=testDB;
User ID=MyAdmin@xxxxxxxxxx;Password=pass@word1;Trusted_Connection=False;Encrypt=True;" />
</connectionStrings>
或者,如果您希望在代码中执行此操作,则可以使用 SQLConnectionStringBuilder 类构建连接字符串,如下面的代码示例所示:
SqlConnectionStringBuilder csBuilder;
csBuilder = new SqlConnectionStringBuilder();
csBuilder.DataSource = xxxxxxxxxx.database.windows.net;
csBuilder.InitialCatalog = testDB;
csBuilder.Encrypt = true;
csBuilder.TrustServerCertificate = false;
csBuilder.UserID = MyAdmin;
csBuilder.Password = pass@word1;
SqlConnection conn = new SqlConnection(csBuilder.ToString());
conn.Open();
// then do some thing with Results
3. 您可以创建防火墙规则以接受来自您的网络 IP 的连接。
如何管理 SQL Azure
可以使用各种工具和实用程序来处理 Microsoft Windows Azure SQL 数据库。
- sqlcmd 实用程序允许您在命令提示符、sqlcmd 模式下的查询编辑器或 Windows 脚本文件中输入 Transact-SQL 语句、系统过程和脚本文件。sqlcmd 也可以在本地 SQL Server 实例上运行的 SQL Server Agent 作业的操作系统 (cmd.exe) 作业步骤中运行。 您可以在此处了解更多信息 (http://msdn.microsoft.com/en-us/library/windowsazure/ee336280.aspx)
C:\>sqlcmd -U <ProvideLogin@Server> -P <ProvidePassword> -S <ProvideServerName> -d master
1> CREATE DATABASE <ProvideDatabaseName>;
2> GO
1> QUIT
- SQL Server Management Studio : SQL Server Management Studio 可用于访问、配置、管理和管理 SQL 数据库。连接之前,请确保您已在 Azure 管理门户中添加了防火墙规则。
- Windows Azure Platform Management Portal:您可以使用基于 Web 的管理门户来管理 SQL 数据库和数据层应用程序。您可以创建或删除数据库。
RESTful 服务: SQL 数据库管理 API 提供对通过 Windows Azure Platform Management Portal 执行的管理操作的以编程方式访问,以管理 SQL 数据库服务器。使用 SQL 数据库管理 API,您可以为每个订阅管理 SQL 数据库服务器以及与每个服务器关联的防火墙规则。 在此我列出了一些用于管理 SQL 数据库的 RESTful 方法,有关完整信息,您可以访问 http://msdn.microsoft.com/en-us/library/windowsazure/gg715281
- 枚举订阅的 SQL 数据库服务器的操作请求:https://management.database.windows.net:8443/{SubscriptionID}/servers
- 创建订阅的 SQL 数据库服务器的操作请求:https://management.database.windows.net:8443/{SubscriptionID}/servers
- 删除订阅的 SQL 数据库服务器的操作请求:https://management.database.windows.net:8443/{SubscriptionID}/servers/{ServerName}
- 为 SQL 数据库服务器设置管理员密码的操作请求:https://management.database.windows.net:8443/{SubscriptionID}/servers/{ServerName}?op=ResetPassword
集成 Azure SQL REST API 的步骤
SQL 数据库管理 API 需要证书的相互身份验证。任何有效的 X.509 v3 证书都可用于针对 SQL 数据库管理 API 进行身份验证。您可以使用自签名证书或由证书颁发机构签名的证书。
证书密钥的长度必须至少为 2048 位。Windows Azure 将拒绝任何不符合此要求或无效的证书。
要创建证书,请在管理员帐户的 Visual Studio 命令提示符中运行此命令。
makecert -sky exchange -r -n "CN=SqlAzureRest" -pe -a sha1 -len 2048 -ss My "SqlAzureRest.cer"
然后通过上传证书向导将上面创建的证书上传到 Windows Azure。 然后复制证书的指纹,调用 REST 服务需要用到指纹。
现在我们需要实现 SQL Azure 的 REST API 调用。
创建一个新的 MVC 应用程序(甚至是一个控制台应用程序),并添加新类以及以下方法来处理 REST 调用。
获取服务器列表。
private static string certificateThumbprint = ""; //replace your certificate Thumbprint
private static string x_ms_version = "2013-05-19"; // this is important.
private static string certificateFile = @"D:\RaviSqlRestAzure.cer"; //give the path of certificate.
创建一个 Azure 服务器列表的方法。
public AzureListViewModel getAzureList(string subscriptionID)
{
SqlRestMetadata objMetdata = new SqlRestMetadata();
try
{
//First read the certificate from certificate
// store which will be used to authenticate the request.
X509Store certificateStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
certificateStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certificates = certificateStore.Certificates;
certificateThumbprint = Regex.Replace(certificateThumbprint,
@"[^\u0000-\u007F]", string.Empty); // to remove whitespace.
var matchingCertificates =
certificates.Find(X509FindType.FindByThumbprint, certificateThumbprint, false);
var managementCert = matchingCertificates[0];
X509Certificate2 cert = new X509Certificate2(certificateFile);
string requestUrl = string.Format(CultureInfo.InvariantCulture,
"https://management.database.windows.net:8443/{0}/servers", subscriptionID);
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(requestUrl);
req.Method = "GET";
req.Headers.Add("x-ms-version", "1.0");
req.ClientCertificates.Add(managementCert);
using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
{
_list = new List<SqlRestServiceData>();
objMetdata.Requestid = resp.Headers["x-ms-request-id"];
objMetdata.returnStatusCode = (int)((HttpWebResponse)resp).StatusCode;
using (Stream stream = resp.GetResponseStream())
{
using (StreamReader sr = new StreamReader(stream))
{
var xdoc = XElement.Load(sr);
XNamespace ns = "http://schemas.microsoft.com/sqlazure/2010/12/";
foreach (var urlElement in xdoc.Elements(ns + "Server"))
{
SqlRestServiceData returnData = new SqlRestServiceData();
returnData.ServerName = urlElement.Element(ns + "Name").Value;
returnData.AdminLogin = urlElement.Element(ns + "AdministratorLogin").Value;
returnData.DataCenterLocation = urlElement.Element(ns + "Location").Value;
_list.Add(returnData);
}
}
}
}
}
catch (WebException webEx)
{
var resp = webEx.Response;
objMetdata = new SqlRestMetadata();
objMetdata.Requestid = resp.Headers["x-ms-request-id"];
objMetdata.returnStatusCode = (int)((HttpWebResponse)resp).StatusCode;
objMetdata.ErrorMsg = webEx.Message;
}
var returnValues = new AzureListViewModel();
returnValues.resultMetadata = objMetdata;
returnValues.serverList = _list;
return returnValues;
}
现在从 MVC 控制器调用此方法(由于文章篇幅原因,本文未包含 MVC 代码,我将很快在 Windows Azure 上托管它,并提供源代码的下载链接)。
现在我们需要创建一个服务器。 您需要提供有效的详细信息。
- 需要有效的订阅。
- 有效的管理员登录用户 ID。
- 有效的管理员密码(8 个字符(大写、小写、非字母数字、数字)
要创建,请添加以下代码。
public AzureCreateServerViewModel CreateServer(CreateServerModel objParams)
{
AzureCreateServerViewModel objCreateServerModel = new AzureCreateServerViewModel();
//First read the certificate from certificate store
//which will be used to authenticate the request.
try
{
X509Store certificateStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
certificateStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certificates = certificateStore.Certificates;
certificateThumbprint = Regex.Replace(certificateThumbprint,
@"[^\u0000-\u007F]", string.Empty); // to remove whitespace.
var matchingCertificates =
certificates.Find(X509FindType.FindByThumbprint, certificateThumbprint, false);
var managementCert = matchingCertificates[0];
X509Certificate2 cert = new X509Certificate2(certificateFile);
string requestUrl = string.Format(CultureInfo.InvariantCulture,
"https://management.database.windows.net:8443/{0}/servers",
objParams.subscriptionid);
HttpWebRequest webRequest = HttpWebRequest.Create(requestUrl) as HttpWebRequest;
webRequest.ClientCertificates.Add(managementCert);
webRequest.Headers["x-ms-version"] = "1.0";
webRequest.Method = "POST";
//=== Add the Request Payload ===//
string xmlBody = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<Server xmlns=\"http://schemas.microsoft.com/sqlazure/2010/12/\">\n" +
" <AdministratorLogin>" +
objParams.AdminLogin + "</AdministratorLogin>\n" +
" <AdministratorLoginPassword>" +
objParams.AdminLoginPassword + "</AdministratorLoginPassword>\n" +
" <Location>" + objParams.DataCenterLocation +
"</Location>\n" +
"</Server>";
byte[] bytes = Encoding.UTF8.GetBytes(xmlBody);
webRequest.ContentLength = bytes.Length;
webRequest.ContentType = "application/xml;charset=utf-8";
using (Stream requestStream = webRequest.GetRequestStream())
{
requestStream.Write(bytes, 0, bytes.Length);
}
//=== Send the request and wait on the response ===//
using (WebResponse webResponse = webRequest.GetResponse())
{
//=== x-ms-request-id is useful for troubleshooting request failures with Microsoft ===//
objCreateServerModel.Requestid = webResponse.Headers["x-ms-request-id"];
objCreateServerModel.returnStatusCode = (int)((HttpWebResponse)webResponse).StatusCode;
objCreateServerModel.AdminName = objParams.AdminLogin;
objCreateServerModel.DataCenterLocation = objParams.DataCenterLocation;
using (Stream stream = webResponse.GetResponseStream())
{
using (XmlTextReader xmlReader = new XmlTextReader(stream))
{
while (xmlReader.Read())
{
switch (xmlReader.NodeType)
{
case XmlNodeType.Element:
if (xmlReader.Name == "ServerName")
{
if (xmlReader.Read() && (xmlReader.NodeType == XmlNodeType.Text))
{
objCreateServerModel.NewServerName = xmlReader.Value.ToString();
}
}
break;
}
}
}
}
}
}
catch (WebException webEx)
{
var resp = webEx.Response;
objCreateServerModel = new AzureCreateServerViewModel();
objCreateServerModel.Requestid = resp.Headers["x-ms-request-id"];
objCreateServerModel.returnStatusCode = (int)((HttpWebResponse)resp).StatusCode;
objCreateServerModel.ErrorMsg = webEx.Message;
}
return objCreateServerModel;
}
通过 REST 调用创建 SQL 服务器
Azure SQL 报表服务
SQL 报表提供了您从 SQL Server 报表中了解到的许多功能,用于创建包含表格、图表、地图、仪表等的报表,并将它们部署在私有云和公共云上。您可以将报表导出为各种流行文件格式,包括 Excel、Word、HTML、PDF、XML、CSV 和 ATOM Feed。
它将如何帮助 CourseLearner。
1. 您可以将报表导出为各种流行文件格式,包括 Excel、Word、HTML、PDF、XML、CSV 和 ATOM Feed。
2. 我们无需使用第三方库手动创建报表或以 HTML 格式显示。
集成 Azure SQL 所需的先决工具
- Business Intelligence Studio 2012:http://www.microsoft.com/en-in/download/details.aspx?id=36843
- Azure SDK 以创建 MVC WebRole。
- SSRS 的基本理解。
- 登录 Azure Portal 并创建 SQL 报表服务。
- 创建后,复制报表服务的 Web URL。
- 创建报表服务器项目并创建报表(由于文章篇幅原因,我不包括这些细节)
- 然后选择报表服务器项目并单击属性,然后根据您的 URL 更改设置。(确保您选择了正确的 TargetSeverVersion 并更改了 TargetServerURL 以匹配您上面复制的报表服务器 WebURl。 )
- 然后将项目部署到 Azure。右键单击报表服务器项目 -> 单击“部署”。
<add key="USERNAME" value="YourAzureSSRSUserName" />
<add key="PASSWORD" value="YourAzureSSRS Password" />
add key="REPORT_PATH" value="/AzureReport/Report1" />
选择您的 MVC 应用程序项目 -> 然后添加一个名为“Report”的新文件夹,添加一个名为“report.aspx”的新 Web 窗体项。
在您的 report.aspx 中添加这些代码。
<form id="form1" runat="server">
<asp:scriptmanager ID="Scriptmanager1" runat="server"></asp:scriptmanager>
<div style="width:100%;height: 100%;">
<rsweb:ReportViewer ID="ReportViewer1" runat="server"
ProcessingMode="Remote" Height="600px"
ShowParameterPrompts="False" Width="700px" ></rsweb:ReportViewer>
</div>
</form>
在 report.aspx.cs 中,将这些代码添加到 page load 事件中。
DataSourceCredentials cred = new DataSourceCredentials();
cred.Name = "DataSource1";
cred.UserId = "YourSQLServerLogin"; // this is the UserID which you used to Connect SQL
cred.Password = "YourSQLServerPassword";
ReportViewer1.ShowParameterPrompts = false;
ReportViewer1.ShowCredentialPrompts = false;
if(!this.IsPostBack) // make Sure you add this, or else Reporting will go in infinite loop.
{
try
{
ReportViewer1.ServerReport.ReportServerUrl =
new Uri(ConfigurationManager.AppSettings["SERVER_NAME"]);
ReportViewer1.ServerReport.ReportPath =
ConfigurationManager.AppSettings["REPORT_PATH"];
ReportViewer1.ServerReport.ReportServerCredentials = new ReportCredential();
ReportViewer1.ServerReport.SetDataSourceCredentials(new DataSourceCredentials[] { cred });
}
catch (Exception ex)
{
throw;
}
}
ReportViewer
控件管理身份验证 Cookie,使您的任务更轻松。要显示部署到 SQL Reporting 报表服务器的报表,请像处理任何服务器报表一样,在 ReportViewer
控件中提供报表服务器 URL 和报表路径。然后实现 IReportServerCredentials
接口并在 ServerReport.ReportServerCredentials
中使用它。
public class ReportCredential : IReportServerCredentials
{
public WindowsIdentity ImpersonationUser
{
get
{
return null;
}
}
public ICredentials NetworkCredentials
{
get
{
return null;
}
}
public bool GetFormsCredentials(out Cookie authCookie,
out string user, out string password, out string authority)
{
authCookie = null;
user = ConfigurationManager.AppSettings["USERNAME"];
password = ConfigurationManager.AppSettings["PASSWORD"];
authority = ConfigurationManager.AppSettings["SERVER_NAME"];
return true;
}
}
我们如何在 mvc 视图中使用 webforms?答案很简单,我们可以使用 iframe,将源指向 report.aspx。
在您的 Report.cshtml (MVC) 中。
<div style="width: 100%; min-height: 500px; height: 100%;">
<iframe src="~/Reportts/ReportViewer.aspx" width="800" height="500" frameborder="0"></iframe>
</div>
现在您可以在云中运行报表了。
在集成 Azure SSRS 和混合应用程序时,有一些需要注意的陷阱,我曾遇到过。
- 部署报表服务时,请确保将 TargetServerVersion 设置为“SQL Server 2008 R2 或更高版本”。//参见上面的部署图像
- 在您的 report.aspx 中使用 ScriptManager 以使报表正常工作。
- 如果您在将站点部署到 Azure 时遇到此错误:“Assembly "Microsoft.ReportViewer.Common, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" or one of its dependencies”
要解决此问题,请将以下 dll 复制到您的应用程序 bin 文件夹。
C:\WINDOWS\assembly\GAC_MSIL\Microsoft.ReportViewer.Common\
Pick_Framework_Version_of_11\Microsoft.ReportViewer.Common.dll
C:\WINDOWS\assembly\GAC_MSIL\Microsoft.ReportViewer.ProcessingObjectModel\
Pick_Framework_Version_of_11\Microsoft.ReportViewer.ProcessingObjectModel.dll
C:\WINDOWS\assembly\GAC_MSIL\Microsoft.ReportViewer.WebForms\
Pick_A_Framework_Version_of_11\Microsoft.ReportViewer.WebForms.dll
最终结果。
SQL 报表服务最重要的一点:部署到 Azure 后,您无法启动/停止报表服务。Azure 提供每月 100 小时的免费 SQL 报表服务。 因此,我以前的 Azure 帐户超出了月度配额,从而导致该月Azure 帐户被暂停。所以您在将 SSRS 部署到 Azure 时应小心。在此期间,我上传了SSRS 与 MVC4 集成的源代码(您可以在本文开头找到)。
Azure SQL 中的备份和恢复
SQL Azure 提供了许多有用的方法来备份和恢复 SQL 数据库。以下是我们实现备份和恢复功能的方法。
- 使用 SQL Management Studio。 : 您可以通过 SQL Server Management 进行备份和恢复。您需要为 SQL 创建一个凭据。然后您可以备份和恢复数据库。
为 SQL 创建凭据
CREATE CREDENTIAL mycredential
WITH IDENTITY= 'mystorageaccount' – this is the name of the storage account
you specified when creating a storage account (your Storage Account)
, SECRET = '<storage account access key>' – this should be either the Primary or Secondary Access
Key for the storage account (YourStorageACcesskey)
下一步是为您的 Azure SQL创建备份。
BACKUP DATABASE AdventureWorks2012
TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.bak'
WITH CREDENTIAL = 'mycredential' --put credintial, which we created above
,COMPRESSION
,STATS = 5;
GO
用于恢复
RESTORE DATABASE AdventureWorks2012 FROM URL =
'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.bak'
WITH CREDENTIAL = 'mycredential'
,BLOCKSIZE = 65536
,STATS = 5
Windows Azure SQL 数据库:创建数据库副本
此功能允许您复制正在运行的数据库,在同一数据中心创建另一个功能齐全的 SQL Azure 数据库。
数据库副本可以在同一台或不同的 Windows Azure SQL 数据库服务器上创建,但服务器必须位于同一区域。
CREATE DATABASE destination_database_name AS COPY OF [source_server_name].source_database_name
Windows Azure SQL 数据库导入/导出服务
直接在 Windows Azure SQL 数据库和 Windows Azure BLOB 存储之间导入或导出。此功能是通过 Azure 管理门户公开的免费服务,并以 .BACPAC 扩展名的单个文件包导出所有支持的数据库架构对象和表数据。 需要注意的一点是,.BACPAC 文件不等同于备份,因为它不包含事务日志和历史数据,并且本身不具备事务一致性。
- 要导出,您可以登录到 Azure 门户。 导出实用程序将创建一个存储帐户,以便将数据库导出为 .bacpac 文件,并将其存储在 Blob 容器中。
- 可以通过提供 Blob 容器中的 bacpac URL 来导入数据库。
SQL Azure 与本地数据同步
SQL Azure Data Sync 使本地 SQL Server 数据能够轻松地与 SQL Azure 共享,从而使您能够扩展本地数据以开始创建新的云应用程序。使用 SQL Azure Data Sync 的双向数据同步支持,在 SQL Server 或 SQL Azure 中所做的更改都会自动同步回来。 http://www.windowsazure.com/en-us/manage/services/sql-databases/getting-started-w-sql-data-sync/
SQL Azure 数据库允许您轻松地将数据地理分布到一个或多个世界各地的 SQL Azure 数据中心。现在,无论您在哪里更改数据,它都会无缝地同步到您所有的数据库,无论是本地的还是任何 SQL Azure 数据中心的。
实现 Azure 数据同步的先决条件
- 下载 Azure Data Sync 客户端 http://www.microsoft.com/en-us/download/details.aspx?id=27693
- 确保您已在 Azure SQL 中创建了数据库服务器。
SQL 数据同步术语表
- 同步组是为 SQL Data Sync (Preview) 服务配置为相互同步的 SQL 数据库实例和 SQL Server 数据库的集合。一个同步组由一个“中心”数据库和一个或多个“成员”数据库组成。“中心”数据库必须是 SQL 数据库实例。
- 中心数据库是您在创建同步组时定义为“中心”的 SQL 数据库实例。在同步组中,非中心数据库的 SQL 数据库实例是“成员”数据库。
如何实现 Azure 数据同步。
- 首先登录 Windows Azure Portal 并单击 SQL 数据库。然后创建一个新的 SyncAgent。 创建完成后,复制将用于 Sync 数据客户端的访问密钥。
![]()
- 下一步是配置客户端同步代理。下载客户端同步代理并安装。打开客户端同步代理,并提供以下详细信息。
- 提供您之前复制的访问密钥。
- 注册您将要与云同步的数据库。
- 通过 ping 测试同步服务。
![]()
![]()
- 完成后,您可以验证同步组现在已与我们的本地数据关联。
![]()
- 下一步是创建一个同步组。转到门户中的 SQL 数据库菜单,然后单击“同步”->“添加新同步组”。提供同步组详细信息。 请确保输入中心用户名而不包含服务器名称。例如:如果您的 SQL 密码是=“someUser@SomeServer.net”,则您只需要输入“someUser”(忽略 @server 部分)。
![]()
- 下一步是提供要同步的引用数据库详细信息。
- 双向 - 对引用数据库的更改会写入中心数据库,对中心数据库的更改也会写入引用数据库。
- 从中心同步 - 数据库接收来自中心的更新。它不会将更改发送到中心。
- 同步到中心 - 数据库将更改发送到中心。中心中的更改不会写入此数据库。
![]()
下一步是添加同步规则。您需要指定同步规则,其中包含:
- 需要同步的表和列。
- 同步操作的频率。
转到 SQL 数据库 -> 单击“Sync(preview)”菜单。然后单击您之前创建的同步组。
添加同步规则并单击同步。
现在您可以验证同步操作。您甚至可以配置同步操作的频率。
Windows Azure 存储服务
Windows Azure Blob 存储是一项用于存储大量非结构化数据,可以从世界任何地方通过 HTTP 或 HTTPS 访问的服务。单个 Blob 的大小可达数百 GB,单个存储帐户可包含多达 100 TB 的 Blob。Blob 存储的常见用途包括:
- 直接向浏览器提供图像或文档
- 存储用于分布式访问的文件
- 流式传输视频和音频
- 执行安全备份和灾难恢复
Windows Azure 提供包含 3 个组件的存储服务。
- 存储帐户:所有对 Windows Azure 存储的访问都通过存储帐户完成。这是访问 Blob 的命名空间的最高级别。一个帐户可以包含无限数量的容器,只要它们的总大小不超过 100 TB。
- 容器:容器提供了一组 Blob 的分组。所有 Blob 必须位于容器中。一个帐户可以包含无限数量的容器。一个容器可以存储无限数量的 Blob。
- Blob:任何类型和大小的文件。Windows Azure 存储中可以存储两种类型的 Blob:块 Blob 和页 Blob。大多数文件是块 Blob。单个块 Blob 的大小可达 200 GB。本教程使用块 Blob。页 Blob 是另一种 Blob 类型,大小可达 1 TB,并且在文件中的字节范围频繁修改时效率更高。有关 Blob 的更多信息,请参阅“了解块 Blob 和页 Blob”。
在应用程序中实现 Azure Blob 服务。
可以通过 Web 角色或使用应用程序中的 Windows Azure 存储 SDK 来使用 Azure Blob 服务。在我们的应用程序中,我们使用 Azure MVC4 Web 角色将视频上传到 Azure 存储服务。
先决条件/设置
- 下载 Windows Azure SDK 2.0(链接在资源中)。
- 登录 Windows Azure Portal 并创建存储服务。
- 提供 URL(全部小写)。这将是访问 Azure 云中 Blob 内容的终结点。
- 然后转到“管理访问密钥”并将在记事本或剪贴板中复制 Azure 存储帐户名称和访问密钥,以便在我们的应用程序中使用。
为应用程序实现 Azure Web 角色。
- 创建一个新的云项目并添加一个 MVC4 Web 角色,然后选择 Web 角色并右键单击并选择属性。
- 现在您已准备好使用 Azure 存储。构建解决方案后,Windows Azure 存储模拟器将在 localhost 上运行。如果您遇到错误“进程无法访问文件,因为它被另一个进程占用”。然后请退出 Utorrent。因为它将阻止 Azure 存储端口。
netstat -p tcp -ano | findstr :10000 // run in Command prompt(Admin)
如何将 Blob 上传到云。
首先,我们需要通过 nuget 包安装 Windows Azure 存储库。打开 nuget 包管理器,然后搜索 Windows Azure storage。
您可以使用 CloudStorageAccount
类型来表示您的存储帐户信息。如果您正在使用 Windows Azure 项目模板和/或对 Microsoft.WindowsAzure.CloudConfigurationManager
有引用,则可以使用 CloudConfigurationManager
类型从 Windows Azure 服务配置中检索存储连接字符串和存储帐户信息:
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString")); // Get the storage Account
下一步是创建一个 CloudBlobClient。 CloudBlobClient 类型允许您检索表示 Blob 存储服务中存储的容器和 Blob 的对象。
// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
下一步是创建一个容器来存储云中的 BLOB 对象。
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");
// Create the container if it doesn't already exist.
container.CreateIfNotExists();
默认情况下,新容器是私有的,您必须提供存储访问密钥才能从该容器下载 Blob。如果您想让容器中的文件对所有人可用,可以使用以下代码将容器设置为公共:
container.SetPermissions(new BlobContainerPermissions{PublicAccess =BlobContainerPublicAccessType.Blob});
Blob 存储服务提供了两种形式的 Blob 存储:
- 块 Blob : 允许您高效地上传大型 Blob。块 Blob 由块组成,每个块都由块 ID 标识。您通过写入一组块并按块 ID 提交它们来创建或修改块 Blob。每个块的大小可以不同,最大为 4 MB。块 Blob 的最大大小为 200 GB,并且一个块 Blob 最多可以包含 50,000 个块。
- 您可以并行上传多个块以减少上传时间。每个块都可以包含 MD5 哈希以验证传输,因此您可以跟踪上传进度并根据需要重新发送块。
- 您可以按任何顺序上传块,并在最终的块列表提交步骤中确定它们的顺序。您还可以上传一个新块来替换相同块 ID 的现有未提交块。
- 页 Blob:是 512 字节页的集合,针对随机读写操作进行了优化。要创建页 Blob,您需要初始化页 Blob 并指定页 Blob 将增长的最大大小。要添加或修改页 Blob 的内容,您需要通过指定偏移量和对齐到 512 字节页边界的范围来写入一个或多个页。对页 Blob 的写入可以覆盖一个页、几个页,或最多 4 MB 的页 Blob。对页 Blob 的写入是就地执行的,并立即提交到 Blob。页 Blob 的最大大小为 1 TB。
容器创建完成后,您就可以在云中创建文件了。
// Retrieve reference to a blob named "myblob".
CloudBlockBlob blockBlob = container.GetBlockBlobReference("myblob");
// Create or overwrite the "myblob" blob with contents from a local file.
using (var fileStream = file.InputStream)
{
blockBlob.UploadFromStream(fileStream); //filestream is the uploaded file
}
读取 Azure 上传的 Blob。
- 要读取 Blob,我们将使用 ListBlobs() 方法来获取特定容器的 Blob 项。
ListBlobs 方法返回的对象类型取决于执行的列表类型。如果 UseFlatBlobListing 属性设置为 true,则列表将返回 CloudBlob 对象的枚举集合。如果 UseFlatBlobListing 设置为 false(默认值),则列表可能返回包含 CloudBlob 对象和 CloudBlobDirectory 对象的集合。后一种情况提供了对虚拟 Blob 层次结构的后续枚举的便利。
CloudBlobClient blobClient = objClient.InitBlobClient(storageAccount);
// Retrieve a reference to a container.
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");
// Loop over items within the container and output the length and URI.
List<BlobModel> blobList=new List<BlobModel>();
foreach (IListBlobItem item in container.ListBlobs(null, false))
{
if (item.GetType() == typeof(CloudBlockBlob))
{
CloudBlockBlob blob = (CloudBlockBlob)item;
BlobModel objModel = new BlobModel();
objModel.Url = blob.Uri.ToString();
objModel.size = blob.Properties.Length.ToString();
blobList.Add(objModel);
}
Windows Azure 表存储服务
存储大量结构化数据。该服务是一个 NoSQL 数据存储,它接受来自 Windows Azure 云内部和外部的身份验证调用。Windows Azure 表非常适合存储结构化、非关系数据。表服务的常见用途包括:
- 存储能够服务于 Web 规模应用程序的 TB 级结构化数据。
- 存储不需要复杂连接、外键或存储过程,并且可以反规范化以实现快速访问的数据集。
- 使用聚集索引快速查询数据。
- 使用 OData 协议和 LINQ 查询以及 WCF Data Service .NET 库访问数据。
表存储服务的先决条件理解。
- URL 格式:代码使用此地址格式访问帐户中的表:http://<storage account>.table.core.windows.net/<table>
- 存储帐户:所有对 Windows Azure 存储的访问都通过存储帐户完成。存储帐户中 Blob、表和队列内容的总大小不能超过 100 TB。
- 表:表是实体集合。表不对实体强制执行架构,这意味着单个表可以包含具有不同属性集的实体。一个帐户可以包含许多表,其大小仅受 100 TB 存储帐户限制的限制。
- 实体:实体是一组属性,类似于数据库行。一个实体最多可以有 1MB 大小。
- 属性:属性是名称-值对。每个实体最多可以包含 252 个属性来存储数据。每个实体还具有 3 个系统属性,用于指定分区键、行键和时间戳。具有相同分区键的实体可以更快地查询,并且可以以原子操作插入/更新。实体在分区内的行键是其唯一标识符。
如何:以编程方式访问应用程序中的表存储。
- 获取指定连接字符串的 CloudStorageAccount。
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
ConfigurationManager.ConnectionStrings["StorageConnectionString"].ConnectionString);
- 您可以创建一个 CloudTable Client。 CloudTableClient 对象允许您获取表和实体的引用对象。以下代码创建一个 CloudTableClient 对象并使用它来创建一个新表。本指南中的所有代码都假定正在构建的应用程序是 Windows Azure Cloud Service 项目,并且使用存储在 Windows Azure 应用程序的服务配置中的存储连接字符串。
// Retrieve the storage account from the connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create the table client.
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
// Create the table if it doesn't exist.
CloudTable table = tableClient.GetTableReference("video");
table.CreateIfNotExists();
- 要向表中添加实体,请创建一个 C# POCO 类来定义实体的属性。
- 识别您的分区键和行键以唯一标识表中的实体。
- 具有相同分区键的实体比具有不同分区键的实体查询速度更快,但使用不同的分区键可以提高并行操作的可伸缩性。
public class VideoEntity : TableEntity // not here we are inherting from the TableEntity
{
public VideoEntity(string videoURl, string VideoName)
{
this.PartitionKey = videoURl,
this.RowKey = VideoName)
}
public CustomerEntity() { }
public string VideoLength { get; set; }
public string VideoGuid{ get; set; }
}
要插入实体,您可以使用 CloudTable.Execute()
方法。
// Retrieve the storage account from the connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create the table client.
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
// Create the CloudTable object that represents the "video" table.
CloudTable table = tableClient.GetTableReference("video");
// Create a new videoentity.
VideoEntity videoObj= new VideoEntity("someFile.mp4", "Course1");
videoObj.VideoGuid = "AAABA-ASDSAAA-ASAA";
videoObj.VideoLength = "544444";
// Create the TableOperation that inserts the Videoentity.
TableOperation insertOperation = TableOperation.Insert(videoObj);
// Execute the insert operation.
table.Execute(insertOperation);
探索 Azure SQL 的工具。
- Azure 存储浏览器:Azure Blob 浏览器
Azure 存储浏览器: Azure 存储浏览器是一个有用的 GUI 工具,用于检查和修改 Windows Azure 存储项目中的数据,包括云托管应用程序的日志。
下载链接: http://azurestorageexplorer.codeplex.com/ 。
2. SQL Azure 诊断工具 此工具用于缩短故障排除 SQL Azure 问题时的数据收集过程。 您可以将 CSAD 指向您的 SQL Azure 实例,提供适当的凭据,然后将看到有关您实例的一些有用汇总数据。
挑战 4: Windows Azure 虚拟机
虚拟机可按需提供可扩展的计算基础结构,当您需要快速配置资源以满足不断增长的业务需求时。
虚拟机优势。
Windows Azure 中的虚拟机是什么
- 以满足业务需求的步调配置计算基础结构。
- 企业级支持,提供面向企业的可靠产品。
- 使用您熟悉的工具,为未来做好准备。
Windows Azure 中的虚拟机是云中的服务器,您可以对其进行控制和管理。 虚拟硬盘(.vhd 文件)用于创建虚拟机。
为什么我们需要虚拟机在我们的应用程序中?映像 - 映像是用于创建新虚拟机的模板。映像没有特定设置,如正在运行的虚拟机,例如计算机名称和用户帐户设置。
磁盘 - 磁盘是 VHD,您可以将其作为操作系统的运行版本引导和挂载。映像预配后,它将成为磁盘。使用映像创建虚拟机时,始终会创建一个磁盘。连接到虚拟化硬件并作为服务一部分运行的任何 VHD 都是磁盘。
我们选择虚拟机是为了从 Azure 获得以下好处:
- 能够运行提升的启动脚本以安装应用程序、修改注册表设置、安装性能计数器、微调 IIS 等。
- 能够将应用程序拆分为多个层(可能是 Web 角色用于前端,工作者角色用于后端处理)并独立扩展。
- 能够通过 RDP 连接到您的 VM 以进行调试。
- 网络隔离。
- 支持虚拟网络(与 VPN 一起使用)
如何在 Azure 中创建虚拟机?
虚拟机可以通过多种方式创建。
- 使用 Azure 门户:Azure 门户提供了一种从库中创建虚拟机或从 Windows 存储帐户上传 VHD 的方法。
- 通过 PowerShell 命令。
- 通过 REST API 调用。
那么,让我们在 Azure 中创建一个虚拟机吧!" />
- 首先登录 Windows Azure Portal -> 然后添加新虚拟机。
![]()
- 提供所有详细信息后,单击“创建虚拟机”。创建完成后,您可以从 Azure 门户下载远程桌面连接设置。
![]()
现在您可以配置设置,例如安装 IIS、.net framework 甚至安装所需的软件。
捕获配置好的虚拟机
您可以捕获并使用自己的映像来创建自定义虚拟机。映像是用于创建虚拟机的虚拟硬盘(.vhd)文件。映像是模板,因为它没有已配置虚拟机的特定设置,例如计算机名称和用户帐户设置。如果您想创建多个以相同方式设置的虚拟机,您可以捕获已配置虚拟机的映像并将其用作模板。
为什么我们需要在我们的应用程序中捕获 VM 映像?
- 设置负载均衡器,它将处理所有请求。
![]()
负载均衡的端点是服务中的所有虚拟机使用的特定 TCP 或 UDP 端点。下图显示了一个在三个虚拟机之间共享的负载均衡端点,并使用公共和私有端口 80。
创建负载均衡系统的步骤
- 首先创建虚拟机并配置 IIS、SQL Server 等。
- 将应用程序发布到虚拟机。
- 捕获配置好的映像,并使用此捕获的映像作为模板来创建其他 VM。
步骤 1:捕获 VM 映像
- 首先配置虚拟机,包括 IIS 和接受入站流量请求的防火墙规则。
- 然后下一步是从 RDP 连接到虚拟机,并在管理员权限的命令提示符中运行此命令。
![]()
并选择图中所示的选项。
在单击“确定”之前,需要考虑的事项。
- 在运行 sysprep 之前,将用户添加到您的 VM。Sysprep 会禁用管理员帐户——因此无法连接到 VM(您必须在 sysprep 后通过添加旧磁盘来重新连接),其他帐户保持活动状态。这为我节省了数小时——有时运气会在正确的一边。
sysprep 命令会关闭虚拟机,这会将管理门户中虚拟机的状态更改为已停止。停止虚拟机可能需要长达 20 分钟。虚拟机停止后,您就可以捕获映像了。
![]()
- 捕获过程将首先创建映像,然后删除虚拟机。
从捕获的映像创建虚拟机。
捕获的映像提供了一个模板映像,可用于创建虚拟机。
- 从门户创建一个新虚拟机并选择“从库”。
![]()
- 下一步是提供凭据和云服务 URL。
- 虚拟机创建后,下一步是添加一个端点来处理 HTTP 请求。
- 然后提供端点详细信息(端口、端点名称)
![]()
现在您已成功创建了使用捕获映像的端点和虚拟机。
创建第二个虚拟机作为负载均衡器
- 在 Azure 门户中再创建一个虚拟机。 创建第二个虚拟机时,请确保将 VM 添加到现有虚拟机。 您可以将多个虚拟机连接到同一云服务,以便它们能够相互通信、在它们之间平衡网络流量负载,并保持高可用性。有关连接虚拟机的更多信息,请参阅。
![]()
虚拟机创建完成后,下一步是为新创建的虚拟机添加端点。
![]()
最后,负载均衡器在 Azure 中运行。
![]()
![]()
Azure 虚拟机管理
- 通过 Azure PowerShell 命令: Windows Azure PowerShell 是一个 Windows PowerShell 模块,可用于控制和自动化 Windows Azure 中工作负载的部署和管理。在使用 cmdlet 之前,您需要导入模块并导入发布设置和订阅信息。
一些入门命令。
Add-AzureDataDisk //Adds a new data disk to a Windows Azure virtual machine object. Add-AzureDisk //Adds a new disk to the Windows Azure disk repository. Add-AzureEndpoint //Adds a new endpoint to a Windows Azure virtual machine. Add-AzureProvisioningConfig //Adds the provisioning configuration to a Windows Azure virtual machine. Add-AzureVMImage //Adds a new operating system image to the image repository. Export-AzureVM //Exports a Windows Azure virtual machine state to a file. Get-AzureDataDisk //Gets the data disk object at the specified LUN on the specified Windows Azure virtual machine. Get-AzureDisk //Gets an object with information on disks in the Windows Azure disk repository. Get-AzureEndpoint //Gets an object with information about the endpoints assigned to a Windows Azure virtual machine. Get-AzureOSDisk //Gets the operating system disk object for the specified virtual machine object. Get-AzureVM //Retrieves information from one or more Windows Azure virtual machines. Get-AzureVMImage //Returns an operating system image object. New-AzureVM //Creates a new Windows Azure virtual machine. New-AzureVMConfig //Creates a new Windows Azure virtual machine configuration object.
通过 Windows PowerShell Web 访问从移动设备运行 PowerShell 命令。
Windows PowerShell® Web Access 是 Windows Server® 2012 中的一项新功能,它充当 Windows PowerShell 网关,提供一个基于 Web 的 Windows PowerShell 控制台,该控制台面向远程计算机。
- 使 IT 专业人员能够从浏览器中的 Windows PowerShell 控制台运行 Windows PowerShell 命令和脚本,而无需在客户端设备上安装 Windows PowerShell、远程管理软件或浏览器插件。运行基于 Web 的 Windows PowerShell 控制台所需的所有东西是已正确配置的 Windows PowerShell Web Access 网关,以及支持 JavaScript® 并接受 Cookie 的客户端设备浏览器。
- 客户端设备包括笔记本电脑、非工作用个人电脑、借用的计算机、平板电脑、Web kiosk、未运行 Windows 操作系统的计算机以及手机浏览器。
如何设置 PowerShell Web 访问?
Web 访问的先决条件。
- 在 Azure 中创建一个虚拟机。
- 在虚拟机中安装 Azure PowerShell 工具 http://www.windowsazure.com/en-us/downloads/#cmd-line-tools 或使用 Web 平台安装程序。
- https://windows.azure.com/download/publishprofile.aspx,您可以在其中登录 Windows Azure 帐户下载发布设置文件。请注意您保存此文件的位置。此文件包含 Azure API 信息、您的订阅 ID,最重要的是管理证书,需要使用另一个 cmdlet 在本地机器上导入该证书。
在虚拟机中创建 PowerShell Web 访问模块。
通过远程桌面连接到您的虚拟机,然后打开 PowerShell 命令提示符并运行此命令。
Install-WindowsFeature –Name WindowsPowerShellWebAccess -IncludeManagementTools -Restart Import-Module PowerShellWebAccess Install-PswaWebApplication -useTestCertificate Add-PswaAuthorizationRule * * * Enable-PSRemoting -Force以上代码的解释。
- 第一行代码将为服务器添加一个 Windows 功能。您可以手动从控制面板的程序/功能中添加。
- 第二行和第三行代码将创建 Web 应用程序并在 IIS 中托管它。此工具将自动安装 IIS8、.net4.5 和其他必需的先决条件。
- 我们需要授权用户登录 PowerShell 会话。3 个星号 (*) 代表域、用户名和用户组。
- 我们需要启用 PowerShell 的远程处理。
您可以使用以下 URL 从 Internet Explorer 访问 Windows PowerShell Web 访问:https://servername/pswa。(servername 将是您创建虚拟机时使用的 DNS 名称)。
提供虚拟机的用户名和密码。
- 输入用户名时要小心。用户名应采用 {Yourworkgroup}\yourAdminUserName 的格式。(工作组可以在控制面板下的系统属性中找到)。
![]()
下一步是玩 PowerShell
![]()
首先,我们将发出一些基本命令来熟悉 PowerShell。基本命令如 Date、Get-Process。
![]()
让我们集成 Azure 管理命令。
- 我们需要导入您之前在先决条件步骤中下载的订阅文件。 并将订阅文件放入 c:\users\<username>\Documents
Import-AzurePublishSettingsFile subscription.publishsettings导入完成后,您就可以使用所有 Azure PowerShell 命令了。 http://msdn.microsoft.com/en-us/library/windowsazure/jj152841.aspx
例如:获取虚拟机详细信息。
Get-AzureVM yourVmName
在移动设备上运行 PowerShell Web 访问。
![]()
进行中
- 构建项目架构和存储库:完成。
- 构建 CourseLearner 模型:完成。
- 使用 SQLAzure 为 CourseLearner 进行 CRUD:完成。
资源
- https://developers.google.com/webmasters/smartphone-sites/details
- https://css-tricks.cn/snippets/css/media-queries-for-standard-devices/
- http://mobile.smashingmagazine.com/2013/03/21/responsive-web-design-with-physical-units/
- http://www.vanseodesign.com/web-design/why-responsive-design/
- http://msdn.microsoft.com/en-us/library/windowsazure/jj152841
未来计划
- 与 OAuth 提供商(如 Facebook、Twitter)集成。
- 与领先的电子学习提供商 BlackBoard 集成。
- 为课程材料提供本地化和国际化,并增加课程材料。