.NET中公共组件示例

这部分包含“聊天”模块公共组件使用.NET语言的扩展实施示例。这个示例包括实施获得服务组内在线用户信息的特点。

为使代码工作,应该在开发工具项目添加"System.Web.Extensions"数据库参考。

示例注释

示例的下行包含请求发送的地址:

TeamWoxChatGroups groups = new TeamWoxChatGroups("http://your.domain.com/");

您应该更改"http://your.domain.com/"地址为您自己的TeamWox系统地址。代码中请求的TeamWox内部页面在下面行中指定:

m_TeamwoxURLGetChatGroup = serverHost + "public/chat/groups?json";

访问/public/chat/group 页面,会以JSON格式返回结果。那是可用组列表和它们在线/离线状态状态请求的页面。

全部代码

下面给出公共组件实施的全部代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Web.Script.Serialization;
//---
namespace SendRequestChatOnline
  {
  /// <summary>
  /// Information about each group containing its status and name
  /// </summary>
  class ChatGroup
    {
    public string ID { get; set; }
    public bool OnLine { get; set; }
    public string Name { get; set; }
    }
  /// <summary>
  /// The class for obtaining information about all groups and their statuses
  /// </summary>
  class StatusGroups
    {
    public int Config { get; set; }
    public List<ChatGroup> Groups { get; set; }
    }
  /// <summary>
  /// Conversion of data from json string to the StatusGroups object
  /// </summary>
  public class StatusGroupConverter : JavaScriptConverter
    {
    private static readonly Type[] m_SupportedTypes = new[] { typeof(StatusGroups) };
    public override IEnumerable<Type> SupportedTypes { get { return m_SupportedTypes; } }
    /// <summary>
    /// Desearilization of obtained data into the necessary object
    /// </summary>
    /// <param name="dictionary">obtained data</param>
    /// <param name="type">data type</param>
    /// <param name="serializer">class of serializer</param>
    /// <returns>filled class StatusGroups or null</returns>
    public override object Deserialize(IDictionary<string,object> dictionary,
                                        Type type,
                                        JavaScriptSerializer serializer)
      {
      StatusGroups obj = new StatusGroups
                           {
                             Config = (int)dictionary["config"],                         //--- id
                             Groups = ParsingGroups(dictionary["groups"] as ArrayList)   //--- list of available groups
                           };
      //---
      return obj;
      }
    /// <summary>
    /// Parser for groups
    /// </summary>
    /// <param name="listGroups">list of grouos</param>
    /// <returns></returns>
    private static List<ChatGroup> ParsingGroups(ArrayList listGroups)
      {
      List<ChatGroup> resultItems = new List<ChatGroup>();
      //---
      foreach(IDictionary<string,object> dictionary in listGroups)
        {
        if(dictionary == null)
          continue;
        //---
        resultItems.Add(new ChatGroup
                       {
                         ID = (string)dictionary["id"],           //--- id of group
                         Name = (string)dictionary["name"],       //--- name of group
                         OnLine = (int)dictionary["online"] == 1  //--- status of group
                       });
        }
      //---
      return resultItems;
      }
    /// <summary>
    /// Stopper of serialization. Not used
    /// </summary>
    public override IDictionary<string,object> Serialize(object obj,JavaScriptSerializer serializer)
      {
      return null;
      }
    }
  /// <summary>
  /// The class for working with information about groups and their statues
  /// </summary>
  class TeamWoxChatGroups
    {
    private readonly string m_TeamwoxURLGetChatGroup;
    public TeamWoxChatGroups(string serverHost)
      {
      m_TeamwoxURLGetChatGroup = serverHost + "public/chat/groups?json";
      }
    /// <summary>
    /// Sending of http request
    /// </summary>
    private static string OpenUrlGet(string url)
      {
      HttpWebRequest request =  (HttpWebRequest)WebRequest.Create(url);
      request.Method = "GET";
      request.Headers.Add("UserAgent","Web-site");
      //--- fill information to be sent to the TeamWox server
      request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
      request.AllowAutoRedirect = false;
      request.KeepAlive = false;
      //--- make request
      HttpWebResponse response = (HttpWebResponse)request.GetResponse();
      Stream responseStream = response.GetResponseStream();
      StreamReader reader = new StreamReader(responseStream);
      string result = reader.ReadToEnd();
      reader.Dispose();
      //---
      response.Close();
      responseStream.Dispose();
      //---
      return result;
      }
    /// <summary>
    /// Getting data from json
    /// </summary>
    /// <param name="json">string in the json fromat</param>
    /// <returns>the object with information about groups</returns>
    private static StatusGroups ParsingStringJson(string json)
      {
      JavaScriptSerializer serializer = new JavaScriptSerializer();
      serializer.RegisterConverters(new List<JavaScriptConverter> { new StatusGroupConverter() });
      return serializer.Deserialize<StatusGroups>(json);
      }
    /// <summary>
    /// Getting information about all groups and their statuses
    /// </summary>
    /// <returns></returns>
    public StatusGroups QueryGetChatGroup()
      {
      string stringJson = OpenUrlGet(m_TeamwoxURLGetChatGroup);
      //---
      return ParsingStringJson(stringJson);
      }
    }
  /// <summary>
  /// The main class for calling of console application
  /// </summary>
  class Program
    {
    static void Main()
      {
      //--- creation of the main class
      TeamWoxChatGroups groups = new TeamWoxChatGroups("http://your.domain.com/");
      //--- getting information about groups
      StatusGroups statusGroups = groups.QueryGetChatGroup();
      //--- displaying of information about groups
      if(statusGroups != null && statusGroups.Groups != null)
        {
        foreach(ChatGroup chatGroup in statusGroups.Groups)
          {
          Console.WriteLine(chatGroup.Name + " " + (chatGroup.OnLine ? " On line" : "Off line"));
          }
        }
      Console.ReadLine();
      }
    }
  }