Beispiel für die öffentlichen Komponente in .NET

Dieser Abschnitt enthält ein erweitertes Beispiel der Implementierung der öffentlichen Komponente des "Chat"-Moduls in der Sprache .NET. Dieses Beispiel umfasst die Implementierung von zusätzlichen Möglichkeiten, um Informationen über die Online-Benutzer in den Bedienungsgruppen zu erhalten.

Für die Arbeit dieses Codes im Projekt Visual Studio muß man die Links (References) zur Bibliothek "System.Web.Extensions" hinzufügen.

Kommentare zum Beispiel

Die nächste Zeile des Beispiels enthält die Adresse, an die die Anfrage gesendet werden soll:

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

Man muss die Adresse "http://your.domain.com/" durch die Adresse Ihres TeamWox-Systems ersetzten. Die interne TeamWox-Seite, die in dem Code angefordert wird, wird in der folgende Zeile angegeben:

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

Die Seite /public/chat/group wird aufgerufen, und das Ergebnis kommt im Format JSON zurück. Gerade aus diese Seite werden eine Liste der verfügbaren Bedienungsgruppen, und auch ihr Online/Offline Status angefordert.

Vollständiger Code

Der vollständige Code der Implementierung der öffentlichen Komponente ist unten angegeben:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Web.Script.Serialization;
//---
namespace SendRequestChatOnline
  {
  /// <summary>
  /// Die Daten über jede Gruppe mit dem Status und Namen
  /// </summary>
  class ChatGroup
    {
    public string ID { get; set; }
    public bool OnLine { get; set; }
    public string Name { get; set; }
    }
  /// <summary>
  /// Die Klasse für das Erhalten der Daten über alle Gruppen und deren Status
  /// </summary>
  class StatusGroups
    {
    public int Config { get; set; }
    public List<ChatGroup> Groups { get; set; }
    }
  /// <summary>
  /// Die Konvertierung der Daten aus der JSON-Zeichenkette in das Objekt StatusGroups
  /// </summary>
  public class StatusGroupConverter : JavaScriptConverter
    {
    private static readonly Type[] m_SupportedTypes = new[] { typeof(StatusGroups) };
    public override IEnumerable<Type> SupportedTypes { get { return m_SupportedTypes; } }
    /// <summary>
    /// Deserialisierung von erhaltenen Daten in das gewünschte Objekt
    /// </summary>
    /// <param name="dictionary">die angekommenen Daten</param>
    /// <param name="type">Typ der Daten</param>
    /// <param name="serializer">Klasse von Serializer</param>
    /// <returns>die gefüllte Klasse StatusGroups, oder 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)   //--- Liste der verfügbaren Gruppen
                           };
      //---
      return obj;
      }
    /// <summary>
    /// Parser für Gruppen
    /// </summary>
    /// <param name="listGroups">Liste der Gruppen</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 der Gruppe
                         Name = (string)dictionary["name"],       //--- Name der Gruppe 
                         OnLine = (int)dictionary["online"] == 1  //--- Status der Gruppe 
                       });
        }
      //---
      return resultItems;
      }
    /// <summary>
    /// Stopper für Serialisierung. Nicht verwendet
    /// </summary>
    public override IDictionary<string,object> Serialize(object obj,JavaScriptSerializer serializer)
      {
      return null;
      }
    }
  /// <summary>
  /// Die Klasse für die Arbeit mit Informationen über Gruppen und deren Status
  /// </summary>
  class TeamWoxChatGroups
    {
    private readonly string m_TeamwoxURLGetChatGroup;
    public TeamWoxChatGroups(string serverHost)
      {
      m_TeamwoxURLGetChatGroup = serverHost + "public/chat/groups?json";
      }
    /// <summary>
    /// Senden von http Anfrage
    /// </summary>
    private static string OpenUrlGet(string url)
      {
      HttpWebRequest request =  (HttpWebRequest)WebRequest.Create(url);
      request.Method = "GET";
      request.Headers.Add("UserAgent","Web-site");
      //--- wir füllen die Daten für das Senden an den TeamWox Server aus
      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>
    /// Erhalten von Daten aus JSON
    /// </summary>
    /// <param name="json">Zeichenkette im Format JSON</param>
    /// <returns>das Object mit den Daten über die Gruppen</returns>
    private static StatusGroups ParsingStringJson(string json)
      {
      JavaScriptSerializer serializer = new JavaScriptSerializer();
      serializer.RegisterConverters(new List<JavaScriptConverter> { new StatusGroupConverter() });
      return serializer.Deserialize<StatusGroups>(json);
      }
    /// <summary>
    /// Empfang von Daten über alle Gruppen und deren Status
    /// </summary>
    /// <returns></returns>
    public StatusGroups QueryGetChatGroup()
      {
      string stringJson = OpenUrlGet(m_TeamwoxURLGetChatGroup);
      //---
      return ParsingStringJson(stringJson);
      }
    }
  /// <summary>
  /// Die Hauptklasse für den Aufruf der Konsolen-Anwendung
  /// </summary>
  class Program
    {
    static void Main()
      {
      //--- Erstellung der Hauptklasse
      TeamWoxChatGroups groups = new TeamWoxChatGroups("http://your.domain.com/");
      //--- Empfang von Daten über die Gruppen
      StatusGroups statusGroups = groups.QueryGetChatGroup();
      //--- Anzeige von Daten über die Gruppen
      if(statusGroups != null && statusGroups.Groups != null)
        {
        foreach(ChatGroup chatGroup in statusGroups.Groups)
          {
          Console.WriteLine(chatGroup.Name + " " + (chatGroup.OnLine ? " On line" : "Off line"));
          }
        }
      Console.ReadLine();
      }
    }
  }