Dieser Artikel wurde maschinell übersetzt.

Team Foundation Server und Exchange

Aufbau eines Ticketing-Systems mit Using Exchange und Team Foundation Server

Mohammad Jalloul

Downloaden des Codebeispiels

Team Foundation Server (TFS) bietet eine großartige Methode für das Erstellen und Verwalten von Tickets über seine leistungsfähige Arbeitsaufgabenverfolgungs-Funktionalität. Solche Tracking wird in der Regel in zwei Arten erreicht werden. In der ersten erstellt ein Support-Mitarbeiter mit Zugriff auf TFS über seine Web-Schnittstelle (bezeichnet als Team System Web Access oder TSWA) einen benutzerdefinierte Arbeitsaufgabentyp für ein Support-Ticket, die erforderlichen Informationen eingeben. Bei der zweiten Methode wird eine Schnittstelle erstellt, um die Funktionalität der Arbeit Element umbrochen und vereinfachen den Zugriff darauf für externe Benutzer, die nicht über TFS kennen müssen. Die Arbeitsaufgabe wird dann in der Regel Software Engineer zugewiesen, die überwacht und verwaltet die Arbeitsaufgabe aus innerhalb der Visual Studio. Ziel der beiden Methoden ist es, Ticket-Erstellung von e-Mail- oder proprietäre Datenbanksysteme in TFS aufgrund der vielen Vorteile zu verschieben – insbesondere TFS arbeiten Elemente einen Workflow, der Lebenszyklus eines Tickets definiert haben. Jedermann kann verfolgen ein Ticket der Überwachung von Änderungen an der Arbeitsaufgabe und Anzeigen der Versionsgeschichte der Arbeitsaufgabe. Integration mit dem TFS-Datawarehouse bietet zusätzliche Vorteile, wie Sie die leistungsstarken reporting-Funktionen des SQL Server Reporting Services (SSRS) oder Excel Services nutzen können.

Trotz solcher Methoden erhalten E-mails oft um sowieso gesendet weiter erklären Sie Ihr Problem oder Hinzufügen von Details. Manchmal ist diese zusätzliche e-Mail-Thread-Informationen verloren, und manchmal manuell kopiert, in der Versionsgeschichte der Arbeitsaufgaben, den Kontext der Arbeitsaufgabe so vollständig wie möglich zu halten. Dieser manuelle Intervention den Zweck von Arbeitsaufgaben und kann der Produktivität zu töten, Arbeit, die Elemente bieten entwickelt wurden.

Präsentiere ich eine dritte Methode in diesem Artikel, die das beste aus beiden Welten: e-mail- und Arbeitsaufgaben. Dieser Ansatz beginnt mit e-Mail – ebenso wie Support Wiederholungen getan haben, für eine lange Zeit.

Exchange-Webdienste

Der Prozess, die, den ich vorstellen werde, verwendet die Leistungsfähigkeit von Microsoft Exchange Web Services (EWS) zum Abonnieren von Benachrichtigungen für E-mails an eine Verteilerliste in Exchange 2007/2010. Der listening-Webdienst erstellt eine Arbeitsaufgabe basierend auf alle neuen e-Mails empfangen. Die Versionsgeschichte der Arbeitsaufgaben, mit die Unterhaltung-Tracking-Funktionen des Microsoft Exchange Server, daher spiegeln den E-mail-Thread in der Arbeitsaufgabe werden keine nachfolgenden E-mails im Zusammenhang mit dem gleichen Thread angefügt. Die Arbeitsaufgabe verwaltet auch einen Workflow. Auf diese Weise die Benutzer – der Support-Mitarbeiter – nicht ändern ihre Gewohnheiten Anpassung an eine neue Technologie; Stattdessen wird die Technologie unter Berücksichtigung ihres Prozesses und Automatisierung.

Abbildung 1 zeigt, wie der Prozess normalerweise fließen kann.

Process Flow for the Support Ticket Work Item

Abbildung 1 Prozess-Flow für die Support-Ticket-Arbeitsaufgabe

Im folgenden wird Flow ausführlicher erläutert:

  1. Der Fluss beginnt, wenn ein Problem mit einem Produkt ein Supportmitarbeiter benachrichtigt wird.
  2. Support-Mitarbeiter sendet eine E-mail, beschreibt das Problem in einer Verteilerliste (DL) in Exchange. Die DL umfasst alle Benutzer über das Thema wissen und dem jeweiligen Entwickler zur Behebung zuweisen können. Die DL enthält auch eine "Beobachter" E-mail-Konto, das nur zu Benachrichtigungszwecken vorhanden ist. Watcher-Konto ist mit Exchange registriert, so dass es an einer bestimmten Adresse der Web Service-Benachrichtigungen erhält.
  3. Exchange verarbeitet die E-mail weiterleiten an alle Mitglieder der Verteilerliste und Senden von Benachrichtigungen an alle Webdienste, die registriert sind, um für eine angegebene E-mail-Konto zu erhalten.
  4. Support-Ticket-Webdienst empfängt eine Benachrichtigung von Microsoft Exchange über seine Web-Schnittstelle.
  5. Der Webdienst verarbeitet die Benachrichtigung und zusätzliche Informationen im Zusammenhang mit der e-Mail-Adresse anfordert. Anschließend wird eine Kundendienstanfrage Arbeitsaufgabe in TFS, die mit Informationen aus der e-Mail-Nachricht aufgefüllt wird erstellt.
  6. Die DL-Mitglieder erhalten auch die e-Mail-Nachricht, und gefragt werden, Weitere Informationen, die die Support-Mitarbeiter senden, wird möglicherweise reagieren. Da die DL ist enthalten, an oder CC-Felder der E-mail-Nachricht, E-mail-Konto von Watcher ist bekannt, dass dies und der Webdienst Benachrichtigungen empfängt Benachrichtigungen über alle E-mails, die im Thread passiert. TFS aktualisiert die Arbeitsaufgabe Support-Anforderung mit zusätzlichen Informationen.
  7. Das Ticket ist ein Entwickler verwenden das Feld zugewiesen an der Kundendienstanfrage Arbeitsaufgabe nur erstellt zugewiesen.
  8. Der Entwickler startet zum Thema arbeiten, ändern den Zustand der Arbeitsaufgabe In Bearbeitung. Wenn Sie der Code, enthält das Update überprüft, getestet und abgeschlossen ist, wird es eingecheckt werden. Die resultierende Differenzmenge ist die Arbeitsaufgabe Support-Anforderung zugeordnet. Diese Arbeitsaufgabe verfolgt jetzt e-Mail-Unterhaltung und die Differenzmenge im Zusammenhang mit der Korrektur.
  9. Wenn der Support-Mitarbeiter Zugriff auf TFS hat, können Support-Anforderung ihn für das Schließen zugewiesen werden. Andernfalls kann die DL per E-mail benachrichtigt werden. In der Regel werden Projektmanagern und Leads TFS Warnungen einrichten so, dass sie benachrichtigt werden, wenn eine Kundendienstanfrage Arbeitsaufgabe gelöst wurde. Dies findet statt, wenn die Arbeitsaufgabe In Bearbeitung, erledigt geändert wird.

Der Prozess ähnelt tatsächlich, was normalerweise in realen Szenarios im Zusammenhang mit Supportproblemen stattfindet – mit Ausnahme von E-mail-Thread im wirklichen Leben und ticketing-System sind in der Regel zwei völlig unterschiedliche und separate Systeme.

Der Support-Ticket-Benachrichtigungen-Webdienst

Support-Ticket-Benachrichtigungen-Webdienst verwendet das EWS Managed API, ermöglicht verwaltet.NET-Anwendungen kommunizieren mit EWS dokumentierte Schnittstellen über bekannte SOAP-basierten messaging verwenden. Sie finden eine detaillierte Beschreibung der EWS verwaltete API auf bit.ly/jGKRgG.

EWS ist kein typisches Teil einer Installation von Microsoft Exchange, und in vielen IT-Installationen ist es auf einer separaten Exchange-Clientzugriffsserver installiert. Um verwendet werden, müssen die Dienste installiert und mit Microsoft Exchange konfiguriert werden. Sie müssen die EWS-Webdienst-URL aus Ihrem Exchange-Administratoren beziehen sich so etwas wie https://Hostnamen/EWS/Exchange.asmx. Beachten Sie, dass diese Webdienste in der Regel auf einen SSL-Endpunkt eingerichtet sind.

Die neueste Version der EWS verwaltete API zum Zeitpunkt des Verfassens dieses Artikels ist 1.1. Diese Version unterstützt Microsoft Exchange Server 2007 SP1 durch Exchange Server 2010 SP1. Downloaden von bit.ly/mkb7Is.

Standardmäßig kopiert der Installer die Dateien auf [Programmdateien] \Microsoft\Exchange\Web Services\1.1. Die API in einer Assembly mit dem Namen Microsoft.Exchange.WebServices.dll gepackt. The installation folder includes two important files you should review before starting to work with the API: Readme.htm file and GettingStarted.doc.

Der erste Schritt bei der Interaktion mit EWS ist einen Webdienst Anhören von Benachrichtigungen aus Exchange erstellt. Nach diesen Webdienst erstellt wird, muss es mit Exchange registriert werden, um Benachrichtigungen zu starten.

Microsoft Exchange Server 2010 SP1 Web Services SDK vereinfacht die Erstellung von solchen Web Services. Können Sie die Oktober 2010-Version (die neueste Version zum Zeitpunkt des Verfassens dieses Artikels) unter bit.ly/kZtjLq.

Das SDK erleichtert das ersten Webdienst zu erstellen. Es enthält vier Beispiele, die verschiedene Bereiche, die von der API gezielt untersuchen. Sie können die Proben nach der Installation des SDK navigieren Sie zum Startmenü zugreifen | Alle Programme | 2010 SP1 Web Services SDK Exchange Server | Oktober 2010 | Exchange Server 2010 SP1 Web Services SDK-Beispielverzeichnis. Das Beispiel, die von besonderem Interesse ist PushNotification, die einen Push-Benachrichtigungen-Webdienst veranschaulicht, der überwacht und verarbeitet eingehende Benachrichtigungen von Exchange. Dieses Beispiel enthält auch eine Client-Anwendung, die Sie verwenden können, erstellen Sie ein Abonnement im Austausch für den Webdienst. Verwenden dieses Beispiel als eine Basisimplementierung erleichtert Weise EWS Works zu verstehen und stellen Sie sicher, dass alle erforderlichen Teile funktionsfähig sind.

Abonnieren mit Exchange

Sie müssen ein Exchange-Konto ein Abonnement für Benachrichtigungen mit Exchange zu erstellen. Das Abonnement wird eingerichtet, das routing, so dass keine E-mails gesendet, um diesem Dienstkonto-Postfach in Exchange einen Anruf zum Dienst Benachrichtigungen für dieses Konto registriert führen werden. Beachten Sie, dass es möglich ist, mehr als eine Benachrichtigung für alle angegebenen Konto zu registrieren. In der Tat ist es sogar möglich, mehr als ein Abonnement für den gleichen Webdienst-Endpunkt zu erstellen. Aus Exchange und EWS-Perspektive ist dies völlig legitim.

Die einzige Voraussetzung für Webdienste mit EWS registriert ist, dass sie eine bestimmte Schnittstelle, INotificationServiceBinding, implementieren, die die folgende Signatur verfügt:

public interface INotificationServiceBinding {
  SendNotificationResultType SendNotification(
    SendNotificationResponseType sendNotification);
}

Die einzige Voraussetzung ist, dass der Webdienst eine Implementierung der SendNotification-Methode enthält. Dies ist die Web-Methode, die von Exchange aufgerufen wird, wenn eine übereinstimmende Attribute Abonnement E-mail empfangen wird.

Gehen zurück zum Beispiel PushNotification und insbesondere die PushNotificationSubscriber-Konsolenanwendung wird klar was ein Abonnement umfasst. Abbildung 2 zeigt die SubscribeForPushNotification-Methode der PushNotificationSubscriber.cs-Datei entnommen.

Abbildung 2 Abonnementscode aus dem PushNotification-Beispiel

public static void SubscribeForPushNotifications()
{
  System.Net.ServicePointManager.ServerCertificateValidationCallback =
    delegate(Object obj, X509Certificate certificate, X509Chain chain,
    SslPolicyErrors errors)
  {
      // Replace this line with code to validate server certificate.
return true; 
  };

  // Create the bindings and set the credentials.
ExchangeServiceBinding esb = new ExchangeServiceBinding();
  esb.Url = "https://CAS01.contoso.com/EWS/exchange.asmx";
  esb.Credentials = new NetworkCredential("username", "password", "domain");

  // Create a new subscription.
SubscribeType subscribeRequest = new SubscribeType();
  PushSubscriptionRequestType pushSubscription = 
    new PushSubscriptionRequestType();

  // Subscribe to events in the inbox folder.
BaseFolderIdType[] folders = new BaseFolderIdType[1];
  DistinguishedFolderIdType folderId = new DistinguishedFolderIdType();
  folderId.Id = DistinguishedFolderIdNameType.inbox;
  folders[0] = folderId;
  pushSubscription.FolderIds = folders;

  // Subscribe to all events.
NotificationEventTypeType[] eventTypes = 
    new NotificationEventTypeType[6];
  eventTypes[0] = NotificationEventTypeType.NewMailEvent;
  eventTypes[1] = NotificationEventTypeType.CopiedEvent;
  eventTypes[2] = NotificationEventTypeType.CreatedEvent;
  eventTypes[3] = NotificationEventTypeType.DeletedEvent;
  eventTypes[4] = NotificationEventTypeType.ModifiedEvent;
  eventTypes[5] = NotificationEventTypeType.MovedEvent;
  pushSubscription.EventTypes = eventTypes;

  // Receive push notifications every 1 minutes.
pushSubscription.StatusFrequency = 1;

  // Identify the location of the client Web service.
pushSubscription.URL = "http://clientWebService/Service.asmx";

  // Form the subscribe request.
subscribeRequest.Item = pushSubscription;

  // Send the subscribe request and get the response.
SubscribeResponseType subscribeResponse = 
    esb.Subscribe(subscribeRequest);

  // Check the result.
if (subscribeResponse.ResponseMessages.Items.Length > 0 &&
    subscribeResponse.ResponseMessages.Items[0].ResponseClass ==
      ResponseClassType.Success)
  {
    SubscribeResponseMessageType subscribeResponseMessage =
      subscribeResponse.ResponseMessages.Items[0] as   
        SubscribeResponseMessageType;

      using (StreamWriter sw = new StreamWriter("MailboxEventLog.txt"))
      {
        sw.WriteLine("Subscribed for Push notifications: {0}", 
          subscribeResponseMessage.SubscriptionId);
      }
  }

  CreateXmlMessageTextFile(subscribeRequest, subscribeResponse);

}

Ich habe den Code im enthalten Abbildung 2 hier da den Schlüssel veranschaulicht Funktionen verfügbar, wenn Sie ein Abonnement registrieren. Beachten Sie insbesondere, wie im Beispiel die erste Information, Client Access-Server-URL zuweist:

esb.Url = "https://CAS01.contoso.com/EWS/exchange.asmx";

Es verwendet dann die Anmeldeinformationen des E-mail-Konto mit EWS authentifizieren:

esb.Credentials = new NetworkCredential("username", "password", "domain");

Beachten Sie auch, wenn Sie ein Abonnementobjekt erstellt haben, sie konfigurieren können, so dass es nur zu bestimmten Ereignissen (neue Mail, kopieren, verschieben, löschen, ändern und so weiter) oder bestimmte e-Mail-Ordner abonniert. Dies bietet große Flexibilität, wie Sie die Filterung auf Exchange anstatt alle Ereignisse abonnieren und Filterung in der Anwendung später delegieren können.

Beachten Sie schließlich die StatusFrequency-Eigenschaft. Dies wird einen numerischen Wert, der definiert, wie oft sendet Exchange Heartbeat-Aufrufe an den Webdienst um sicherzustellen, dass der registrierte Endpunkt lebendig ist, in Minuten. Dies hilft Exchange-Abonnements für Endpunkte abzubrechen, die nicht mehr gültig ist, z. B. für einen Webdienst, der auf einen neuen Host verschoben und daher wurde eine neue URL. Wenn Sie vergessen, die vor dem Verschieben des Web-Dienstes kündigen, kann das Abonnement auf unbestimmte Zeit dauern, und Exchange würde halten Senden von Benachrichtigungen unnötig zu einem nicht vorhandenen Endpunkt.

Jetzt sehen wir uns die angepasste Implementierung, Unterstützung für die Erstellung von Arbeitsaufgaben anfordern TFS unterstützen. Die beste Möglichkeit, die Funktionalität zu präsentieren ist mit einem Webdienst-Demo starten, und tauchen Sie in der Implementierung.

Bereitstellen des Webdiensts

Das Codeprojekt, das diesen Artikel begleitet enthält nur einen Webdienst und mehrere andere unterstützende Artefakte. Es ist keine separate Konsolenanwendung, um die Registrierung kümmern da es in der Web-Dienst integriert ist.

Einmal erstellt, kann der Webdienst aus Visual Studio 2010 oder durch Kopieren der resultierenden vorkompilierten Website zu einem Host bereitgestellt werden. Sie müssen die Webanwendung und einem entsprechenden Anwendungspool manuell zu erstellen. Legen Sie die Identität des Anwendungspools Watcher-Benutzerkonto. Dies ist wichtig, da der Webdienst Identität die Identität von Anwendungspool annehmen und verwenden, um das Abonnement ausführen kann. Dies hat zwei Vorteile:

  1. Die Anmeldeinformationen müssen nicht erneut eingegeben werden, jedes Mal, wenn der Web-Dienst muss neu registriert werden.
  2. Die Anmeldeinformationen müssen nicht gespeichert werden, in dem sie auf diese verwenden, um erneut abonnieren zugegriffen werden kann.

Der Webdienst muss Schreibberechtigungen auf zwei Ordner: der Ordner auf dem schreibt Protokolle und den Ordner als den TFS-Cache verwendet. Darüber hinaus müssen Sie so konfigurieren Sie die folgenden Einstellungen in der Datei web.config, wie sie der jeweiligen Umgebung abhängig, in denen der Webdienst verwendet wird:

  • EWSServiceUrl: Die Exchange-URL; erhalten Sie diese URL von der Exchange-Administratoren.
  • TeamFoundationServerUrl: Die URL der TFS-Projekt Auflistung, in denen die Arbeitsaufgaben bereitgestellt werden (z. B.: http://<servername>:8080/tfs/).
  • WorkItemTeamProject: Der Name des Teamprojekts TFS, die Support-Ticket enthält work item Type (z. B.: SupportWorkFlow).
  • WorkItemType: Der eigentliche Name des Support-Ticket work item Type (zum Beispiel: Support-Anforderungen). Wenn die Arbeitsaufgabe wird umbenannt, oder wenn das Web Service verwendet wird, unterstützen einige andere Arbeitsaufgabe eingeben (wie ich später in diesem Artikel zeigen werde), können Sie dies legen Sie den Namen der neuen Arbeitsaufgabe.
  • RequestSupportTeamName: Die Arbeitsaufgabe enthält ein Feld "Anfordern von Support-Team" für die Leitung der verschiedenen Teams an verschiedenen Support-Aufgaben. Dies wird durch eine globale Liste namens Teams in die Definition des Arbeitselements gesteuert. Um dieses Feature zu verwenden, halten Sie die Felddefinition die globale Liste (Anweisungen sind im nächsten Abschnitt dieses Artikels, "Konfigurieren der Arbeitsaufgabe" enthalten) und Erstellen einer der Werte der globalen Liste der Konfigurationsschlüssel RequestSupportTeamName zuweisen (z. B.: Customer Service). Wenn dies nicht der Fall ist, entfernen Sie die globale Liste für das Feld und das "Required"-Einschränkung aus der Arbeitsaufgabe, und lassen Sie den Wert des Schlüssels RequestSupportTeamName leer.

Zu diesem Zeitpunkt ist der Webdienst verwendet werden. Sie können überprüfen, korrekt mit IIS-Manager auf dem Webserver, zu dem Ordner der Webanwendung einrichten (Beachten Sie auf der Registerkarte Inhalt anzeigen unten klicken, wenn IIS 7 oder höher verwenden). Dann mit der rechten Maustaste auf die Datei Service.asmx, und klicken Sie auf Durchsuchen, wie in gezeigt Abbildung 3. Sollten Sie eine Webseite, die identisch mit dem in gezeigten Abbildung 4.

Browsing to the ASMX Page

Abbildung 3 der ASMX-Seite Browsen

Default Web Service URL with localhost as the Host

Abbildung 4 Standard-Webdienst-URL mit "localhost" als Host

Bevor Sie den Webdienst verwenden können, müssen Sie die Arbeitsaufgabe in TFS zu importieren. In diesem Artikel wird vorausgesetzt, Sie TFS 2010 verwenden, aber die dieselbe Arbeitsaufgabe und Web Service mit TFS 2008 verwendet werden kann.

Konfigurieren die Arbeitsaufgabe

Der Beispielcode für diesen Artikel (die Sie unter code.msdn.microsoft.com/mag201108TFS) enthält einen Beispiel Support Ticket-Arbeitsaufgabentyp-Support-Anforderungen bezeichnet. Die Arbeitsaufgaben-Typdefinition, Workflow und Layout vor dem Importieren in TFS anzuzeigen, müssen Sie Installieren von TFS Power Tools, verfügbar unter bit.ly/hyUNqo. Wenn Sie TFS Power Tools installieren, wird ein neues Menü-Prozess-Editor aufgerufen Visual Studio IDE im Menü Extras hinzugefügt. Doppelklicken Sie auf der Support-Request.xml (unter dem Ordner Arbeitsaufgabe in der Beispielprojektmappe befindet). The Work Item Editor window will be loaded with three tabs: Fields, Layout and Workflow, as shown in Figure 5.

Workflow for the Support Ticket Work Item
(zum Vergrößern klicken)

Abbildung 5 Workflow für die Support-Ticket-Arbeitsaufgabe

Die Arbeitsaufgabe Workflow zeigt die verschiedenen Zustände, die die Arbeitsaufgabe unterstützt: neu, wenn die Arbeitsaufgabe wird zunächst erstellt; In Bearbeitung Wenn das Problem dokumentiert wird die Arbeitsaufgabe tatsächlich gearbeitet wird; und arbeiten zum Thema geschehen, wenn beendet werden.

Wenn Sie möchten das Feld Anfordern von Support-Team zu konfigurieren, wie bereits erwähnt, suchen Sie das Feld Anfordern von Support-Team unter der Registerkarte Felder, und doppelklicken Sie im Dialog Felddefinition, und klicken Sie dann auf die Registerkarte Regeln. Wenn Sie nicht auf dieses Feld verwenden, löschen Sie nur die beiden Regeln aufgeführt (ALLOWEDVALUES und erforderlich). Wenn Sie das Feld verwenden möchten, aber andere globale Liste Verwendung konfigurieren möchten, doppelklicken Sie auf die ALLOWEDVALUES-Regel und dann auf der einzige Eintrag vorhanden: GLOBALLIST: Teams. Klicken Sie im Dialogfeld Liste Element zu bearbeiten wählen Sie eine globale Liste, und klicken Sie auf OK.

Wenn Sie eine globale Liste, die noch eingerichtet haben, können Sie eines erstellen (Sie müssen zum TFS-Administrator-Berechtigungen verfügen):

  1. In der Visual Studio-IDE, gehen Sie auf Extras | Prozess-Editor | Globale Liste, und klicken Sie dann auf globale Liste von Server zu öffnen.
  2. Sie werden mit einem Dialogfeld dargestellt. Wählen Sie die Auflistung der Team-Projekt, und klicken Sie auf verbinden.
  3. Im Dialogfeld globale Liste mit der rechten Maustaste auf ein beliebiges Element aus, und klicken Sie dann auf neue globale Liste.
  4. Geben Sie einen Namen für die globale Liste. You can keep the same name as in the work item: Teams.
  5. Mit der rechten Maustaste der neuen globalen Liste, und klicken Sie auf Neues Element. Wiederholen Sie diesen Schritt für so oft wie nötig an die Teamnamen eingeben.
  6. Klicken Sie auf OK, um die neue globale Liste speichern.

Beachten Sie, dass wenn Sie der neuen globalen Liste einen anderen Namen gegeben haben, müssen Sie die Arbeitsaufgabe bearbeiten und seine Definition mit den Namen der globalen Liste aktualisieren.

Zu diesem Zeitpunkt ist die Arbeitsaufgabe in TFS, zu importieren ist wie folgt:

  1. In der Visual Studio-IDE, gehen Sie auf Extras | Prozess-Editor | Arbeitsaufgabentypen Sie, und klicken Sie dann auf Import WIT (WIT steht für den Arbeitsaufgabentyp).
  2. Klicken Sie auf die Schaltfläche Durchsuchen, und navigieren Sie zum Speicherort der Datei Support Request.xml.
  3. Das Projekt zu importieren, um die Liste klicken Sie auf den Namen des Teamprojekts TFS in die Sie importieren möchten die Arbeitsaufgabe und klicken Sie dann auf OK.

Sie können überprüfen, ob die Arbeitsaufgabe in TFS importiert wurde, indem mit der rechten Maustaste auf den Knoten Arbeitsaufgaben für dieses Teamprojekt aus, in Team Explorer und erweitern Sie dann das Fenster Neues Arbeitselement. Support-Anforderung sollte als eine der verfügbaren Optionen angezeigt werden. Wenn Sie es nicht sehen, mit der rechten Maustaste des Knotens Arbeitsaufgaben, und klicken Sie dann auf aktualisieren.

Erstellen eines Abonnements

Siehe Abbildung 4, der Webdienst verfügt über drei Methoden: Status prüfen, SendNotification und abonnieren. Subscribe-Webmethode wird verwendet, die Benachrichtigungsabonnements zu erstellen.

Der Anmeldevorgang wird ein Abonnement für das Benutzerkonto erstellen, das als Identität des Webdienstes Anwendungspool festgelegt ist. Um die Benachrichtigungen effektiv zu verwenden, das Konto – Watcher-Konto – sollte Teil einer Verteilerliste, die überwacht werden, wie in gezeigt Abbildung 6.

Adding the Watcher E-mail Account to a Distribution List

Abbildung 6 Watcher-E-mail-Konto zu einer Verteilerliste hinzufügen

Um ein Abonnement erstellen, klicken Sie auf den Link "abonnieren" auf der Webseite angezeigt, Abbildung 4. Klicken Sie dann auf die Schaltfläche aufrufen, auf der resultierenden Webseite. Bei Erfolg sehen Sie eine Abonnement-ID. Dies ist auch in den Ordner "Logs" in der Datei web.config definierten protokolliert.

Die Details des Abonnements sind in zwei Dateien protokolliert. Die erste protokolliert die Anforderung zu EWS senden, um das Abonnement ausführen und hat die Form SubscribeType-<timestamp> XML. Die zweite Datei protokolliert die Antwort erhielt von EWS, das Abonnement zu bestätigen, und hat die Form SubscribeResponseType-<timestamp> XML. Eine dritte Datei namens SubscriberEventLog.txt protokolliert alle Ereignisse, die vom WWW-Dienst von Exchange, einschließlich einer Heartbeat-Status-Ereignis empfangen, jede Minute und eine neue E-Mail-Ereignisse, wenn sie ausgelöst werden.

Der Status des Abonnements an jedem Punkt überprüft werden kann, durch Aufrufen der CheckStatus Web-Methode, die ein Ergebnis ähnlich wie in dargestellt wird, erzeugt Abbildung 7, zeigt die Zeit das letzte Heartbeat-Ereignis wurde empfangen und den Status der Web Service-Abonnement. If there’s an active subscription, you’ll see “Status: Subscribed,” as shown in the figure.

Sample Output from the CheckStatus Web Method

Abbildung 7 Beispielausgabe CheckStatus Web-Methode

Der Gesamtprozess wird dargestellt, das im Sequenzdiagramm in in Abbildung 8.

The Subscription and Notification Process

Abbildung 8 Abonnement und Benachrichtigungsvorgang

Verwenden das Ticketing-System

Die einfachste Methode zum Starten über das ticketing-System wird zu einem realen Szenario imitieren und senden eine E-mail an die Verteilerliste, die das Watcher-Konto enthält. Abbildung 9 zeigt eine Beispiel-e-Mail die DL gezeigt Abbildung 6, und Abbildung 10 zeigt die Kundendienstanfrage Arbeitsaufgabe, die die Benachrichtigung an den Webdienst Benachrichtigungen von Microsoft Exchange gesendet wurden, generiert wird.

The First E-mail in a Mail Thread

Abbildung 9 die erste E-mail in einem E-Mail-Thread

The Work Item Generated as a Result of the First E-mail
(zum Vergrößern klicken)

Abbildung 10 die Arbeitsaufgabe, die erste E-mail generiert

Abbildung 11 zeigt das Ergebnis von anderen E-mails senden, als Teil der gleichen E-mail-Thread und wie die Versionsgeschichte der Arbeitsaufgaben übersetzt wird. Der erste Thread Ruft eine unterschiedliche Farbe für ihren Header. Der Rest der Threads Abrufen einer anderen Farbe distinct (in diesem Fall Gelb, aber die Farben in der Datei web.config konfiguriert werden können).

The Work Item After a Second E-mail
(zum Vergrößern klicken)

Abbildung 11 die Arbeitsaufgabe nach einer zweiten E-mail

Anpassen von Code

Nun lassen Sie uns einen Blick auf die verschiedenen Teile des Codes, die das System ausgeführt werden. Der Beispielcode für diesen Artikel enthält eine Visual Studio-2010-Lösung namens Email2Workitem.sln. When you load this solution in Visual Studio, you’ll see that the structure is divided into four solution folders: Diagrams, Subscription Library, Web Service and Work Item.

Der Webdienst basiert zum größten Teil auf dem PushNotification SDK-Beispiel. Allerdings habe ich einige Änderungen die Lösung generische und benutzerfreundlich zu halten. Ich werde gehen über die Änderungen und aktivieren Sie das Beispiel in einem ticketing-Lösung vorgenommenen Anpassungen.

Die erste wichtige Änderung ist die Funktionalität, die den Abonnementprozess Web Service integriert werden kann. Dies ist besonders wichtig, da den Web Service abonnieren ohne Anmeldeinformationen für die verwalten können. Manchmal muss das Abonnement erneuert z. B. wenn der Server den Web Service hostet einige Wartungsaktivitäten, z. B. erfährt. Wenn das passiert, App-Pools werden normalerweise beendet, und Exchange die Abonnements wird abgebrochen, da das Heartbeat-Ereignis keine Antwort erhält. Die automatische Erneuerung des Abonnements wird durch Aufrufen der InitializeTimer-Methode im Konstruktor Web Service erreicht. InitializeTimer, dargestellt Abbildung 12, wird ein Zeitgeber mit einem Intervall angegeben, in der Datei web.config erstellt. Dieser Zeitgeber ist verantwortlich für ein Abonnement nach Service-Unterbrechungen, z. B. zu erneuern.

Abbildung 12 InitializeTimer-Methode

private void InitializeTimer()
{
  int autoSubscribeTimeoutThresholdInMinutes = Convert.ToInt32(
    ConfigurationManager.AppSettings["AutoSubscribeTimeoutThresholdInMinutes"]);
 
    lock (_pollingTimerSyncLock)
    {
      if (autoSubscribeTimeoutThresholdInMinutes > 0)
      {
        // Seed the timer with the polling interval specified in config.
if (_pollingTimer == null)
        {
          TimerCallback timerCallback = OnTimedEvent;
          _pollingTimer = new Threading.Timer(timerCallback, null, 0, 
          _pollingIntervalInMilliseconds); // Enable the timer.
}
      }
      else
      {
        // Dispose of the timer.
if (_pollingTimer != null)
        {
          _pollingTimer.Dispose();
          _pollingTimer = null;
        }
      }
    }
}

Die zweite wichtige Änderung hat mit, die eingehende Nachrichten zu bestimmen, ob es sich um die erste E-mail in einem Thread ist zu tun. Abbildung 13 zeigt diese Funktionalität.

Abbildung 13 die erste E-mail in einem Thread festlegen

// Get either the folder or item identifier for a 
// create/delete/new mail event.
if (bocet.Item is ItemIdType)
{
  // Get the item identifier.
ItemIdType itemId = bocet.Item as ItemIdType;
 
  //
  // Get the message using the ItemIdType.
//
 
  // From web.config
  string ewsServiceUrl = 
    ConfigurationManager.AppSettings["EWSServiceUrl"];
 
  ExchangeService esb = 
    new ExchangeService(ExchangeVersion.Exchange2010);
  esb.Url = new Uri(ewsServiceUrl);
  // From Web service App Pool identity.
esb.UseDefaultCredentials = true;
 
  EmailMessage message = EmailMessage.Bind(esb, new ItemId(itemId.Id));
  ConvertEmailToRequestItem(message);
}

Beachten Sie, wie der Code die Tatsache, dass der Webdienst Anwendungspool Identität nutzt, die e-Mail-Kontos, was bedeutet, dass Web aufruft, um die e-Mail-Nachrichtendetails abrufen getan werden kann, ohne Eingabe von Anmeldeinformationen.

ConvertEmailToRequestItem-Methode wird den Großteil der Arbeit. Um festzustellen, ob eine e-Mail-Nachricht die erste e-Mail- oder Teil eines Threads ist es nutzt die ConversationIndex-Eigenschaft der Instanz "EmailMessage". Die Länge des Arrays 
byte ConversationIndex ist 22, wenn er die erste E-mail ist. Nachfolgende E-mails in einem Thread finden Sie weitere Bytes, die die ConversationIndex hinzugefügt. ConvertEmailToRequestItem verwendet, um zu bestimmen, ob die e-Mail-Nachricht als eine neue Nachricht behandelt, und erstellen eine neue Arbeitsaufgabe für ihn oder als Teil eines vorhandenen Threads in diesem Fall das vorhandene Element sucht und den Thread-spezifischen Teil der e-Mail-Nachricht an die Versionsgeschichte der Arbeitsaufgaben Revision fügt. Exchange stellt den Teil einer e-Mail-Nachricht, die spezifisch für die aktuelle E-mail im Thread über die Eigenschaft "EmailMessage" UniqueBody. Um den vollständigen Thread zu erhalten, kann die Body-Eigenschaft verwendet werden. Dies ist sehr leistungsstark, da es erstellen E-mail-Thread in der Versionsgeschichte der Arbeitsaufgaben Revision, ermöglicht wie in gezeigt Abbildung 11.

Ein Sonderfall, der ist Erwähnenswert ist, wenn eine E-mail, die Teil eines Threads, aber keine entsprechende Arbeitsaufgabe eingeht aktualisieren verfügbar ist. Dies geschieht normalerweise, wenn der Thread gestartet wurde, bevor das ticketing-System eingeführt wurde. In diesem Fall wird eine neue Arbeitsaufgabe erstellt.

In der Reihenfolge für den Webdienst, um festzustellen, ob bereits eine E-mail als Element vorhanden ist, es stützt sich auf bestimmte Informationen in der Arbeitsaufgabe speichert, wenn die Arbeitsaufgabe erstellt wird: ConversationIndex. Die Web Service-Abfragen von Arbeitsaufgaben basierend auf diesen Wert, um herauszufinden, ob das Element vorhanden ist. Das Abfragen erfolgt mithilfe der TFS Arbeit Item Query Language (WIQL), wie im folgenden Code:

private const string QUERY_BY_CONVERSATION_INDEX_WIQL =
  "SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = '{0}'  AND
    [System.WorkItemType] = 'Support Request' AND
    [MsdnMag.SupportTicket.ConversationIndex] = '{1}' ORDER BY [System.Id] desc";

WIQL gibt Ihnen eine einfache und doch leistungsstarke Möglichkeit zum Abfragen einer Arbeitsaufgabe ohne laden Objekte und Auflistungen durchlaufen.

Der Web-Service bietet auch eine Möglichkeit, problemlos in TFS-Aktivitätsprotokolle zu verfolgen. Die TFS-Aktivitätsprotokolle werden in zwei SQL Server-Tabellen (Tbl_Command und Tbl_Parameter) für die Team-Projekt-Auflistung in der Datenbank gespeichert. Überprüfen die UserAgent-Spalte in der Tbl_Command können Figur TFS-Administratoren die Quelle der Anforderungen.

Die Web Service-Benachrichtigung passt die Benutzer-Agent-Daten um eindeutig identifizieren sie mithilfe der folgenden Anweisung:

TfsConnection.ApplicationName = string.Format(
  TFS_APPLICATIONNAME_TEMPLATE, WindowsIdentity.GetCurrent().Name);

In diesem speziellen Fall wird der Benutzer-Agent wie "Msdnmagsubscribesvc – Contoso\jdoe" aussehen

Eine andere potenziell nützliche Funktion der ConvertEmailToRequestItem ist seine Fähigkeit zum Filtern von E-mails nach einem bestimmten Präfix in der Betreffzeile, wie im folgenden Code:

// First check if prefix-based filtering is turned on, and if so, 
// if the e-mail subject line matches the defined prefix.
string subjectPrefix = 
  ConfigurationManager.AppSettings["SubjectPrefix"];
if (!string.IsNullOrWhiteSpace(subjectPrefix))
{
  if (!title.StartsWith(subjectPrefix, 
    StringComparison.InvariantCultureIgnoreCase))
  {
    WriteEventToLog(
      string.Format(SUBJECT_DOES_NOT_MATCH_PREFIX_TEMPLATE,
      subjectPrefix, title));
 
    return;
  }
}

Dieses Feature können Sie um die Service-Funktionalität auf nur bestimmte E-mails zu beschränken; z. B. in Code Review E-mails, in denen das Präfix definiert werden kann, als "Codeüberprüfung".

Other Use Cases: Codeüberprüfungen

Der hier vorgestellte Anwendungsfall ist ein Support-Ticket. Allerdings erleichtert die Flexibilität der in diesem Artikel vorgestellte Ansatz zu anderen Fällen verwenden die gleichen Techniken anwenden wie Tracking-Code überprüft. Prozess-Flow für den Code-Review-Anwendungsfall wird dargestellt, in Abbildung 14.

Process Flow for the Code Review Work Item

Abbildung 14 Prozess-Flow für die Code-Review-Arbeitsaufgabe

Entwicklungsorganisationen neigen dazu, Durchführen von Codeüberprüfungen per E-mail. Es wurden viele Versuche Codeüberprüfungen durch Erstellen von Code-Review Arbeitsaufgaben und zum Erstellen von Add-Ins ermöglichen die Verwaltung der Codeüberprüfung aus Visual Studio in TFS integrieren. Dieselbe Technik beschäftigt für Support-Tickets kann jedoch eine einfache Möglichkeit, Code-Review-E-mail-Threads in die TFS-Arbeitsaufgabenverfolgung System integrieren bereitstellen. Die folgenden Schritte eines vorgeschlagenen Prozess für die Verwendung der Benachrichtigungsinfrastruktur mit Codeüberprüfungen:

  • Zunächst erstellen eine Arbeitsaufgabe für die Codeüberprüfung ähnlich wie die Arbeitsaufgabe Support anzufordern.
  • Überwachen von E-mails an die DL Watcher-Konto in ein DL eingerichtet.
  • Verwenden Sie ein Präfix definieren, die E-mails als Code Review E-mails unterscheidet oben vorgestellte SubjectPrefix-Funktion. Code review requests sent via e-mail often have the subject line follow this pattern: “Code Review: My-Shelveset-Name.”

Siehe in Abbildung 14, Rückverfolgbarkeit in der Lebensdauer des Codes aus, wenn der Code durchgeführt wurde, wenn sie für die Codeüberprüfung, gesendet wurde, wenn es für das Einchecken und schließlich beim Einchecken genehmigt wurde bietet der tatsächlichen Einchecken des Inhalts Shelveset der Arbeitsaufgabe zuordnen. Diese Zuordnung ist ein leistungsstarkes Feature von TFS, der großartige Einblicke in Code ermöglicht, die über die Quellcodeverwaltung eingecheckt wird. Es ist besonders Vermögenswert für Unternehmen, die Rückverfolgbarkeit Audit Gründen benötigen.

Nächste

Das Hauptziel dieses Artikels war eine von vielen Möglichkeiten für die Verwendung von TFS und Exchange zusammen, um die Steigerung der Produktivität und Effizienz zu demonstrieren. Einer der Vorteile von Arbeitsaufgaben, vor allem in TFS 2010 ist, wie sie in TFS integriert sind. Arbeitsaufgaben können mit Differenzmengen verknüpft werden. Sie können darstellen und Testpläne verfolgen. Sie können leicht gemeldet werden, mithilfe von Excel oder SSRS, und sie können auch mit Microsoft Project synchronisiert werden.

Bewaffnet mit den Anwendungsfall und in diesem Artikel vorgestellten Techniken, sollten Sie möglicherweise nutzen den Webdienst Benachrichtigungen und die Arbeit Element Anpassungen in viele andere Szenarien, die speziell auf Ihre eigene Umgebung gelten.

Mohammad Jalloul ist eine Software Engineer bei Myspace Inc., eine soziale Unterhaltung-Website, wo er verantwortlich ist für die Integration von TFS in verschiedene Geschäftsprozesse und Nutzung, Effizienz und Produktivität zu erhöhen. Davor arbeitete er in Redmond in der Developer Division bei Microsoft ein internes Tool namens Gibraltar. Er kann erreicht werden, über seinen Blog unter mohammadjalloul.com.

Dank der folgenden technischen Experten für die Überprüfung dieses Artikels: Bill Heys