Verwenden von .NET My Services mit verwalteten Erweiterungen für C++

Veröffentlicht: 05. Apr 2002 | Aktualisiert: 21. Jun 2004

Von Diana Mitran

In diesem Whitepaper werden die einzelnen Schritte zum Erstellen einer Clientanwendung beschrieben, die ein .NET-My-Services-Beispiel verwendet. Die Clientanwendung wird mithilfe der verwalteten Erweiterungen für C++, Visual Studio® .NET und dem .NET My Services Software Development Kit (SDK) geschrieben. Im Vergleich zu einer in Visual C#T oder Visual Basic® erstellten Clientanwendung müssen Sie noch zusätzliche Aspekte berücksichtigen. In diesem Whitepaper wird vorausgesetzt, dass Sie sich mit dem Visual Studio XML-Web-Services-Modell zum Erzeugen und Verwenden von allgemeinen Web Services aus Clientanwendungen auskennen.

* * *

Auf dieser Seite

Einführung Einführung
Anleitung Anleitung

Einführung

Als Teil der Microsoft® .NET-Initiative führt Microsoft eine auf den Benutzer zugeschnittene Architektur und eine Gruppe von XML Web Services unter dem Namen .NET My Services (zuvor "HailStorm") ein. Basierend auf den Funktionen von Microsoft .NET Alerts und Microsoft .NET Passport stellt .NET My Services eine Gruppe von XML Web Services dar, mit denen der Benutzer persönliche Informationen auf sichere Weise speichern und den Zugriff auf diese Informationen steuern kann (verfügbar ab 2002). Die .NET My Services-Plattform ist eine Sammlung von XML Web Services, die über das Internet mithilfe von standardmäßigen Protokollen wie SOAP (Simple Object Access Protocol), XML und UDDI (Universal Description, Discovery and Integration) aufgerufen werden. .NET My Services authentifiziert Benutzer, bietet die Möglichkeit zum Senden von Warnungen und speichert persönliche Informationen wie Kontakte, E-Mail, Kalender, Profile, Listen, elektronische Geldbörse, physikalischer Speicherort, Dokumentenspeicher, Anwendungseinstellungen, Websitefavoriten, zugehörige Geräte und Voreinstellungen für den Empfang von Warnungen.

Um die Entwickler zu ermutigen, mit der Entwicklung von Anwendungen zu beginnen, die diese Services verwenden, hat Microsoft das .NET My Services SDK auf der Professional Developers' Conference im Oktober 2001 freigegeben. Dieses SDK enthält Beispielservices und zwei Open-Source-Projekte, mit denen .NET My Services in Visual Studio integriert werden kann. Diese Open Source-Projekte sind in Visual C# geschrieben und erweitern die Visual Studio-Funktionen, so dass Benutzer problemlos mit den im folgenden Beispiel beschriebenen Besonderheiten von .NET My Services umgehen können.

Zunächst ist es wichtig zu wissen, dass .NET My Services den zentralen Metaservice .NET Services verwendet. Dieser Service vermittelt die Interaktionen zwischen den Clients und den anderen .NET My Services wie .NET Contacts oder .NET Wallet. Die zentralen .NET Services verwalten außerdem im Auftrag der Benutzer die Bereitstellung anderer Services und übermitteln zur Laufzeit den Ort dieser Services an die Clients. Aus diesem Grund muss eine Clientanwendung eine Transaktion mit den zentralen .NET My Services aushandeln, bevor eine bestimmte Anfrage bearbeitet werden kann.

.NET My Services verwendet das Kerberos-Authentifizierungsprotokoll und verschlüsselt alle SOAP-Pakete, um sicherzustellen, dass die persönlichen Daten der Benutzer geschützt werden. Dies bedeutet, dass alle Clientanwendungen über die Funktionalität zur Anforderung von Kerberos-Authentifizierungstickets und Einbindung dieser in alle SOAP-Anfragen verfügen müssen. Außerdem muss der Client SOAP-Anfragen verschlüsseln und SOAP-Antworten entschlüsseln können.

Alle im Servicelokator und in der Verschlüsselung von .NET My Services verwendeten Technologien basieren auf offenen Standards und sind dokumentiert, so dass .NET My Services-Entwickler ihre eigenen Anwendungsebenen zur Handhabung dieser Features entwickeln können. Das .NET My Services SDK enthält jedoch zwei freigegebene Quellprojekte, in denen diese Aspekte berücksichtigt werden. In Visual C# und Visual Basic muss der Benutzer nur Verweise auf diese Projekte in seine Clientanwendungen einfügen, um deren Funktionen nutzen zu können. Dadurch kann der Entwickler für .NET My Services so wie für jeden anderen XML Web Service Code schreiben.

Anmerkung Um das Problem mit den Einschränkungen für Clientanwendungen mit verwalteten Erweiterungen für C++ (Dialogfeld Webverweis hinzufügen) zu umgehen, die XML Web Services mithilfe von stark typisierten DataSets verwenden, werden die erforderlichen Schritte zur Verfügung gestellt. In den zukünftigen Versionen von Visual Studio .NET werden diese zusätzlichen Schritte nicht mehr erforderlich sein.

 

Anleitung

In dieser Anleitung erstellen Sie HsSoapExtension.dll mithilfe des .NET My Services SDK sowie einen einfachen Client mit verwalteten Erweiterungen für C++ und verwenden clientseitigen Beispielcode, um .NET FavoriteWebSites eine Website hinzuzufügen.

So erstellen Sie "HsSoapExtension.dll"

  1. Öffnen Sie in Visual Studio die integrierte Entwicklungsumgebung (Integrated Development Environment oder IDE).

  2. Klicken Sie im Menü Datei auf Öffnen, und klicken Sie anschließend auf Projekt.

  3. Wechseln Sie zum Ordner .NET My Services SDK, und suchen Sie nach der Projektmappe HsSoapExtension.

  4. Klicken Sie auf Öffnen.

  5. Klicken Sie im Menü Erstellen auf Projektmappe erstellen.

    Anmerkung Sie benötigen HsSoapExtension.dll zu einem späteren Zeitpunkt erneut.

So erstellen Sie einen einfachen Client mit verwalteten Erweiterungen für C++

  1. Klicken Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt. Das Dialogfeld Neues Projekt wird angezeigt.

  2. Klicken Sie im Bereich Projekttypen erst auf Visual C++ und dann im Bereich Vorlagen auf Verwaltete C++-Anwendung.

  3. Geben Sie MyServiceClient im Feld Name ein.

  4. Klicken Sie auf OK.

  5. Wechseln Sie in der Befehlszeile in das Projektverzeichnis, und führen Sie folgenden Befehl aus:

    disco http://localhost/WSDL/myFavoriteWebSites.wsdl
    

    Dieser Befehl downloadet die Dateien soaprp.xsd und myFavoriteWebSites.wsdl und erstellt results.discomap. In der erstellten .discomap-Datei werden die Abhängigkeiten zwischen den .wsdl- und .xsd-Dateien beschrieben.

So fügen Sie Ihrem Projekt die erstellten Dateien hinzu

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektknoten. Klicken Sie im Kontextmenü erst auf Hinzufügen und dann auf Vorhandenes Element hinzufügen.

  2. Wechseln Sie zu Ihrem Projektordner, und wählen Sie dann folgende
    Dateien aus: soaprp.xsd, myFavoriteWebSites.wsdl und results.discomap.

  3. Klicken Sie mit der rechten Maustaste auf die Datei results.discomap. Klicken Sie im Kontextmenü auf Eigenschaften, und ändern Sie den Wert der Option Tool auf Webdienst-Proxygenerator.

  4. Klicken Sie erneut mit der rechten Maustaste auf die Datei results.discomap. Klicken Sie im Kontextmenü auf Eigenschaften, und ändern Sie den Wert der Option Tool auf Benutzerdefiniertes Buildtool.

  5. Kopieren Sie HsSoapExtension.dll aus dem Ordner der .NET My Services SDK-Projektmappe in den Quellordner Ihres Projekts.

  6. Geben Sie in die Datei csc.rsp, die sich in %SystemRoot%\Microsoft.NET\Framework\v1.0.xxxx befindet, folgenden Text ein:

    /reference:HsSoapExtension.dll
    
  7. Klicken Sie im Menü Erstellen auf Projektmappe erstellen.
    Dadurch wird die C#-Proxyklasse results.cs für den XML Web Service erstellt und in results.dll implementiert.
    Anmerkung Bei Anwendungen mit verwalteten Erweiterungen werden alle Proxyklassen in C# erstellt, egal ob sie auf .NET My Services oder andere Web Services ausgerichtet sind.

  8. Um den .NET FavoriteWebSites-Service zu verwenden, geben Sie folgende Codezeilen in die Datei MyServicesClient.cpp ein:

    #using <HsSoapExtension.dll> 
    #using <references.dll>
    

Sie haben jetzt alles für den Aufruf von MyService eingerichtet. Im folgenden clientseitigen Beispielcode wird gezeigt, wie Sie eine Website zu .NET FavoriteWebSites hinzufügen, Abfragen dafür erstellen und sie löschen können.

Clientseitiger Beispielcode

int _tmain(void) 
{ 
Microsoft::Hs::ServiceLocator::ServiceLocator* serviceLocator =  
  new Microsoft::Hs::ServiceLocator::ServiceLocator 
  ("http://localhost/myServices", "c:\\logfile.txt", true); 
    try 
      { 
        // 
        // Servicelokator für die Suche und Initialisierung des .NET  
        // FavoriteWebSites-Service/Proxy verwenden 
        // 
        // AUFGABENLISTE: Beim Abfragen eines anderen Benutzers muss  
        // der Benutzername anstelle des Aufrufs von User.GetCurrentUser() angegeben werden. 
        // ANMERKUNG: User.GetCurrentUser funktioniert nicht innerhalb einer ASP.NET-  
        // Anwendung. 
        // 
      myFavoriteWebSites* myFav = dynamic_cast<myFavoriteWebSites*> 
          (serviceLocator->GetService(System::Type:: 
           GetType("myFavoriteWebSites"), 
           User::GetCurrentUser())); 
        // 
        // Neue Favoriten-Website erstellen 
        // 
        favoriteWebSiteType* newWebsite = new favoriteWebSiteType(); 
        localizableString* title = new localizableString(); 
        title->lang = S"en"; 
        title->Value = S"Hello.NET"; 
        newWebsite->title = new localizableString*[1]; 
      newWebsite->title[0] =title; 
        newWebsite->url = S"http://www.microsoft.com"; 
        catType* cat = new catType(); 
        cat->ref = S"system"; 
        newWebsite->cat = new catType*[1]; 
      newWebsite->cat[0] = cat; 
        // 
        // insertRequest erstellen und insert aufrufen. 
        // 
        insertRequestType* insertRequest = new insertRequestType(); 
        // In das Stammverzeichnis des Service einfügen. 
        insertRequest->select=S"/";          
        insertRequest->Items = new Object*[1]; 
      insertRequest->Items[0] = newWebsite; 
        insertResponseType* response = myFav->insert(insertRequest); 
        // 
        // Sicherstellen, dass der Vorgang erfolgreich war. 
        // 
      if(response->selectedNodeCount != 1 || response->status !=  
      responseStatus::success) 
        { 
            throw new Exception(S"Fehler beim Einfügen der neuen favoriteWebSite 
      in myFavoriteWebSites"); 
        } 
        // 
        // Abfrage für die neue Favoriten-Website nach dem Einfügen. 
        // 
        queryRequestType* queryRequest = new queryRequestType(); 
        xpQueryType* xpQuery = new xpQueryType(); 
        // ANMERKUNG: Das Präfix m: wird automatisch in der  
        // SoapExtension für den aktuellen Service deklariert. 
        xpQuery-> 
         select=S"/m:myFavoriteWebSites/m:favoriteWebSite 
         [./m:title='Hello.NET' and ./m:url='http://www.microsoft.com']"; 
        // xpQuery zum Array xpQuery hinzufügen. 
        queryRequest->xpQuery = new xpQueryType*[1]; 
      queryRequest->xpQuery[0] = xpQuery; 
        queryResponseType* queryResponse = myFav->query(queryRequest); 
        // 
        // Zurückgegebene favoriteWebSite aus der Antwort abrufen. 
        // 
        favoriteWebSiteType* returnedWebSite =  
          dynamic_cast<favoriteWebSiteType*>  
          (queryResponse->xpQueryResponse[0]->Items[0]); 
        // 
        // Sicherstellen, dass der Vorgang erfolgreich war. 
        //             
      if(String::Compare (returnedWebSite->title[0]->Value,  
      S"Hello.NET") != 0 ||  
          String::Compare (queryResponse->xpQueryResponse[0]->status , 
          S"success")!= 0) 
        { 
            throw new Exception(S"Fehler beim Abrufen der neuen favoriteWebSite 
            aus myFavoriteWebSites"); 
        }  
        // 
        // Website in einem Meldungsfeld anzeigen. 
        // 
      MessageBox::Show(String::Concat  
          (S"Folgende favoriteWebSite wurde aus  
           myFavoriteWebSites zurückgegeben: ", returnedWebSite->title[0]->Value)); 
        // 
        // Attributwert cat/@ref ersetzen 
        // 
        topLevelAttributeType* redAttribute = new topLevelAttributeType(); 
        redAttribute->name = S"ref"; 
        redAttribute->value = S"newvalue"; 
        replaceRequestType* replaceRequest = new replaceRequestType(); 
        replaceRequest->select=S"/m:myFavoriteWebSites/m:favoriteWebSite 
          /m:cat/@ref[.='system']"; 
        replaceRequest->attribute = new topLevelAttributeType*[1]; 
      replaceRequest->attribute[0] = redAttribute; 
        // 
        // Website löschen 
        // 
        deleteRequestType* deleteRequest = new deleteRequestType(); 
        deleteRequest-> 
          select = S"/m:myFavoriteWebSites/m:favoriteWebSite 
            [./m:title='Hello.NET' and ./m:url='http://www.microsoft.com']"; 
      deleteResponseType* delResponse = myFav-> 
              __identifier(delete)(deleteRequest); 
        // 
        // Sicherstellen, dass der Vorgang für mindestens ein Element ausgeführt wurde  
        // und die Antwort anzeigt, dass der Vorgang erfolgreich war 
        // 
      if(delResponse->selectedNodeCount == 0 || delResponse->status != 
              responseStatus::success) 
        { 
            throw new Exception(S"Fehler beim Löschen der neuen favoriteWebSite aus 
              myFavoriteWebSites"); 
        } 
      MessageBox::Show(S"favoriteWebSite wurde erfolgreich aus 
              myFavoriteWebSites gelöscht"); 
    } 
    catch(SoapException* se) 
    { 
        // 
        // SoapException an Konsole ausgeben. 
        // 
      Console::Write(S"Eine SoapException wurde ausgegeben\n\nAusnahme:\n"); 
      Console::WriteLine(se->ToString()); 
      Console::Write(S"\n\nVon .NET My Services zurückgegebene erweiterte  
              SoapFault-Informationen:\n"); 
      Console::Write(se->Detail->InnerXml); 
    } 
    catch(Exception* ex) 
    { 
        // 
        // Ausnahme an Konsole ausgeben. 
        // 
      Console::WriteLine(ex->ToString()); 
    } 
   Console::WriteLine(S"Drücken Sie zum Beenden die Eingabetaste." ); 
   Console::ReadLine(); 
    return 0; 
}