将signalr2消息存储到Azure存储

本文关键字:Azure 存储 消息存储 signalr2 | 更新日期: 2023-09-27 18:06:56

我正在尝试在Visual Studio 2013上构建我的第一个Web应用程序。

首先,我在Azure上创建了一个帐户(目前是试用版);

其次,我在Visual Studio上创建了一个应用程序。

第三,我成功地创建了一个SignalR Hub (SignalR 2),然后我添加了一个非常简单的聊天应用程序。

工作正常

第四,我创建了一个Azure Storage帐户。

我的下一个任务是将每条消息存储到这个存储中。

但是,我似乎遇到了一堵砖墙。我是新手,所以我使用所有可用的在线教程来指导我。

但是,我找不到任何关于如何将聊天消息存储到Azure存储帐户的指导。

我甚至不知道在哪里配置我的SignalR Hub和我的存储帐户之间的连接:(

我试着用下面的代码创建一个新表:

  using Microsoft.WindowsAzure.Storage;
  using Microsoft.WindowsAzure.Storage.Auth;
  using Microsoft.WindowsAzure.Storage.Table;
  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Web;
  namespace MyGames
  {
  public class storageclass
   {
    string accountName = "mygames";
    string accountKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    try
   {
   StorageCredentials creds = new StorageCredentials(accountName,  
   accountKey);
   CloudStorageAccount account = new CloudStorageAccount(creds, useHttps:   
   false);
   CloudTableClient client = account.CreateCloudTableClient();
   CloudTable table = client.GetTableReference("chatmessages");
   table.CreateIfNotExists();
   Console.WriteLine(table.Uri.ToString());
    }
    catch (Exception ex)
    {
    Console.WriteLine(ex);
     }
   Console.WriteLine("Done... press a key to end.");
  Console.ReadKey();
  }
  }

但是,它包含相当多的错误。但是,最主要的是:

错误1:类、结构或接口成员声明中的令牌"{"无效

将signalr2消息存储到Azure存储

Azure Table是一个键值NoSQL数据库服务,因此是聊天消息的一个很好的选择。为了让您清楚地了解Azure Table是如何工作的,请删除导致语法错误的格式不正确的类,并将以下代码添加到控制台应用程序中,以了解如何从Azure Table插入和读取聊天消息。这是一个用于说明目的的简单示例。您需要花时间考虑对您的特定应用程序来说,什么是分区/行键最有意义的。有关查询设计的更多详细信息,请参阅https://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/。另外,对于生产代码,将连接字符串存储在配置文件https://www.connectionstrings.com/store-connection-string-in-webconfig/

  public class ChatMessage : TableEntity
  {
     public ChatMessage() { }
     public ChatMessage(string user, string time, string message)
     {
        PartitionKey = user;
        RowKey = time;
        Message = message;
     }
     public string SessionID { get; set; }         
     public string Message { get; set; }         
  }
  static void Main(string[] args)
  {
     string storageConnection = "DefaultEndpointsProtocol=https;AccountName=mygames;AccountKey=ADD_YOUR_KEY_HERE";
     // Select table
     CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageConnection);
     CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
     CloudTable table = tableClient.GetTableReference("chatmessages");
     table.CreateIfNotExists();
     // Add a chat messages
     ChatMessage msg1 = new ChatMessage("mdyson", "150816_17:01:00", "What's up?");
     table.Execute(TableOperation.InsertOrReplace(msg1));
     ChatMessage msg2 = new ChatMessage("timarshal", "150816_17:02:00", "Not much.");
     table.Execute(TableOperation.InsertOrReplace(msg2));
     ChatMessage msg3 = new ChatMessage("mdyson", "150816_17:02:30", "Cool.");
     table.Execute(TableOperation.InsertOrReplace(msg3));        
     // Query the messages created between 17:00 and 18:00
     string pkFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "mdyson");
     string rowKeyLower = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThanOrEqual, "150816_17");
     string rowKeyUpper = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThanOrEqual, "150816_18");
     string rkFilter = TableQuery.CombineFilters(rowKeyLower, TableOperators.And, rowKeyUpper);
     string combinedFilter = TableQuery.CombineFilters(pkFilter, TableOperators.And, rkFilter);
     TableQuery<ChatMessage> query = new TableQuery<ChatMessage>().Where(combinedFilter);
     var list = table.ExecuteQuery(query).ToList();
     foreach (ChatMessage entity in list)
     {
        Console.WriteLine("[" + entity.RowKey + "] " + entity.PartitionKey + ": " + entity.Message);
        // [150816_17:01:00] mdyson: "What's up?"
        // [150816_17:02:30] mdyson: "Cool"
     }
     Console.ReadKey();
  }