【Azure Services Platform Step by Step-第12篇】实现Windows Azure聊天室-使用Table Storage

简介:

image

 

首先让我们一起回顾一下Table Storage的结构。

每行都是一个独立的Entity。

Partition Key和RowKey起到了类似于主键的作用,它们用来标识Entity,同时也可以在实际使用中作为分类查询条件。

TimeStamp属性(上图没画出)是每行都默认有的,它自动记录该行数据最后更新的时间。

 

接下来我们来看看StorageClient中是怎样使用TableStorage的

无标题1 

看着这图,单看文件名,觉得很奇怪吧? Blob和Queue都使用了Rest来实现,唯独Table没有一个对应REST的类。那它是怎么做的呢?

查看源代码可以发现,原来,它使用的是System.Data.Services.Client里的DataServiceQuery和DataServiceContext这两个ADO.NET 数据服务的关键类来实现的。拿TableStorageDataServiceContext类来说,它继承自DataServiceContext,或者说,它把DataServiceContext封装成了Azure版!

(对ADO.NET数据服务Client不了解的朋友请查阅http://msdn.microsoft.com/zh-cn/library/system.data.services.client.dataservicecontext.aspx

呵呵,不管怎么样,我们使用方便就好了。

了解完了原理,我们来进入正题吧。

 

第一步:

在VS008中新建Web Cloud Service、配置ServiceConfiguration.cscfg、ServiceDefinition.csdef ,添加对StorageClient项目的引用。这里不再重复了,请直接参考上一篇的内容或者本文篇末附件源代码。

直接使用上一节里的ServiceConfiguration.cscfg和ServiceDefinition.csdef也行,因为账户信息是一样的。

image

image 

 

第二步:

拖入控件,制作简单的登录界面和主聊天界面。这不是重点也不是难点,请大家直接参看本文篇末附件源代码。其实聊天室和留言吧的区别不大,使用ASP.NET Ajax的Timer和UpdatePanel让它每两秒刷新一次就行。

 

 

image

image

 

 

第三步:

建立一个Message实体类。

与传统代码或由ORM工具生成的实体代码不同,它需要继承自TableStorageEntity.

复制代码
  public   class  Message : Microsoft.Samples.ServiceHosting.StorageClient.TableStorageEntity
    
{
        
public Message()
        
{
            PartitionKey 
= "ChatRoom001";
            
            
//取实体时,默认排序是根据RowKey增序列
            RowKey = (DateTime.MaxValue.Ticks - DateTime.Now.Ticks).ToString();
        }


        
public string Name getset; }
        
public string Body getset; }
        

        
//不用定义“消息发布时间”这种字段了,
        
//因为Table Storage有一个自动时间戳属性TimeStamp可以自动记录数据更新时间。
    }
复制代码

 

 

第四步:

建立一个MessageDataServiceContext实体类。该类继承自TableStorageDataServiceContext,也就是间接继承自DataServiceContext。它的作用是获得一个对数据服务上下文的引用。此外,定义一个公共属性Messages:可返回所有Message类型实体; 增加AddMessage方法:将Message实体存入Table Storage。

 

复制代码
  public   class  MessageDataServiceContext : TableStorageDataServiceContext
    
{
        
public MessageDataServiceContext(StorageAccountInfo accountInfo)
            : 
base(accountInfo)
        
{
        }


        
//定义公共属性Messages,返回所有数据服务上下文中的Message类实体。
        public IQueryable<Message> Messages
        
{
            
get
            
{
                
return this.CreateQuery<Message>("Messages");
            }

        }


        
public void AddMessage(string name, string body)
        
{
            
//使用DataServiceContext类提供的AddObject方法来存入实体
            this.AddObject("Messages"new Message { Name = name, Body = body   });

            
//DataServiceContext类提供的SaveChanges()方法来保存修改
            this.SaveChanges();
        }

    }
复制代码

 

第五步:

取实体:

 

复制代码
   // 初始化账户信息
                StorageAccountInfo accountInfo  =  StorageAccountInfo.GetAccountInfoFromConfiguration( " TableStorageEndpoint " );

                
//  自动根据实体类的结构生成Table
                TableStorage.CreateTablesFromModel( typeof (MessageDataServiceContext), accountInfo);

                
//  获取数据服务上下文的引用
                MessageDataServiceContext context  =   new  MessageDataServiceContext(accountInfo);

                
//  取前150条Message实体,作为数据源绑定到messageList中。
                IQueryable < Message >  data  =  context.Messages.Take( 150 );
             
                
this .messageList.DataSource  =  data;
              
                
this .messageList.DataBind();
复制代码

 

存入实体:

 

复制代码
   protected   void  SubmitButton_Click( object  sender, EventArgs e)
        
{
            StorageAccountInfo accountInfo 
= StorageAccountInfo.GetAccountInfoFromConfiguration("TableStorageEndpoint");
            MessageDataServiceContext context 
= new MessageDataServiceContext(accountInfo);
            
            
//调用刚才我们定义的AddMessage方法。其实如果你想看上去更爽的话,
            
//可以把这个方法的入参改为实体 :)
            context.AddMessage(this.nameBox.Text, this.messageBox.Text);
        }
复制代码

 

OK,搞定了!

F5一下看看运行效果吧!

 

            ______————————____忐忑不安的分割线______————————______

通过REST方法获得实体的真实相貌:

image

可以清楚地看到,这个实体有5个属性。其中有3个是默认必须有的属性,只有Body和Name是我们在实体类里自己定义的。


本文转自 流牛木马 博客园博客,原文链接:http://www.cnblogs.com/azure/archive/2009/03/16/1413728.html,如需转载请自行联系原作者

相关文章
|
4月前
|
安全 Windows
【Azure Cloud Service】在Windows系统中抓取网络包 ( 不需要另外安全抓包工具)
通常,在生产环境中,为了保证系统环境的安全和纯粹,是不建议安装其它软件或排查工具(如果可以安装,也是需要走审批流程)。 本文将介绍一种,不用安装Wireshark / tcpdump 等工具,使用Windows系统自带的 netsh trace 命令来获取网络包的步骤
110 32
|
4月前
|
C# Windows
【Azure App Service】在App Service for Windows上验证能占用的内存最大值
根据以上测验,当使用App Service内存没有达到预期的值,且应用异常日志出现OutOfMemory时,就需要检查Platform的设置是否位64bit。
73 11
|
6月前
|
编译器 Windows
plugin cannot be loaded for module “QtQuick“ && Could not load the Qt platform plugin “windows“
本文讨论了在Qt应用程序中遇到的平台插件加载问题,包括具体的错误信息、解决方案和参考链接。问题表现为无法加载“QtQuick”模块的插件,并且无法找到“windows”平台插件。解决方案是修改环境变量`Qt5_DIR`以使用正确的Qt版本和编译器环境。
282 1
|
7月前
|
PHP Windows
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
|
7月前
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
707 0
|
7月前
|
iOS开发 Android开发 MacOS
从零到全能开发者:解锁Uno Platform,一键跨越多平台应用开发的神奇之旅,让你的代码飞遍Windows、iOS、Android、macOS及Web,技术小白也能秒变跨平台大神!
【8月更文挑战第31天】从零开始,踏上使用Uno Platform开发跨平台应用的旅程。只需编写一次代码,即可轻松部署到Windows、iOS、macOS、Android及Web(通过WASM)等多个平台。Uno Platform为.NET生态带来前所未有的灵活性和效率,简化跨平台开发。首先确保安装了Visual Studio或VS Code及.NET SDK,然后选择合适的项目模板创建新项目。项目结构类似传统.NET MAUI或WPF项目,包含核心NuGet包。通过简单的按钮示例,你可以快速上手并构建应用。Uno Platform让你的技术探索之旅充满无限可能。
206 0
|
7月前
|
网络安全 API 数据安全/隐私保护
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
|
7月前
|
Shell PHP Windows
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
|
7月前
|
存储 Linux Windows
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例
|
20天前
|
安全 Unix 虚拟化
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 2 月更新)
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 2 月更新)
44 11
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 2 月更新)