Verwenden von Webdiensterweiterungen zum Senden von SOAP-Nachrichten mit Anlagen

 

Jeannine Hall Gailey
Webberater

Februar 2003

Gilt für:
   Microsoft&174; ASP.NET WebMethods
   Webdiensterweiterungen 1.0 für Microsoft .NET
   WS-Attachments Spezifikation
   DIME-Spezifikation
   Microsoft SOAP Toolkit 3.0

Zusammenfassung: Erfahren Sie, wie Webdiensterweiterungen 1.0 für Microsoft .NET das Senden von Anlagen mithilfe von DIME- und WS-Attachments-Spezifikationen unterstützt. (13 gedruckte Seiten)

Inhalte

Einführung
Verwenden von DIME mit Webdiensterweiterungen
Erweiterte DIME-Unterstützung in WSE
Probleme bei der Verwendung von WSE für DIME
Zusammenfassung

WS-Attachments ist ein vorgeschlagener Webdienststandard, der das DIME-Nachrichtenkapselungsprotokoll nutzt, das das Senden von Anlagen mit SOAP-Nachrichten erleichtert. In diesem Artikel erfahren Sie, wie das neue Web Services Enhancements (WSE) 1.0 für Microsoft .NET das Senden von Anlagen mithilfe von DIME und WS-Attachments Spezifikationen unterstützt.

Einführung

WS-Attachments schreibt eine Methode vor, die direct Internet Message Encapsulation (DIME) zum Senden und Empfangen von SOAP-Nachrichten mit zusätzlichen Anlagen wie Binärdateien, XML-Fragmenten und sogar anderen SOAP-Nachrichten verwendet. Basierend auf einer Spezifikation, die von Microsoft und IBM an die Internet Engineering Task Force (IETF) übermittelt wurde, wurde DIME entwickelt, um eine SOAP-Nachricht und ihre zugehörigen Anlagen auf MIME-ähnliche Weise zu kapseln. Wie bei SOAP können DIME-Nachrichten mithilfe von Standardtransportprotokollen wie HTTP, TCP und UDP gesendet werden. DIME unterstützt Streamingdaten. DIME kann sogar ohne SOAP verwendet werden, obwohl es nur begrenzte Möglichkeiten für DIME gibt, den Inhalt seiner Nachrichten in diesem instance zu beschreiben.

Microsoft hat sich entschieden, DIME und WS-Attachments in der ersten Version von Web Services Enhancements (WSE) zu unterstützen, einer Lösung zum Entwickeln sicherer, robuster und skalierbarer Webdienste mit Microsoft .NET. In diesem Artikel wird die Implementierung von DIME behandelt, anstatt sich mit dem Protokoll selbst vertraut zu lassen. Weitere Informationen zum DIME-Protokoll finden Sie in meinem Artikel zum DIME in der Dezemberausgabe des MDSN Magazins.

Obwohl die Verwendung mit SOAP nicht streng beschränkt ist, besteht der Anstoß für DIME darin, Anlagen mit SOAP-Nachrichten effizienter zu transportieren, was besonders für Webdienste nützlich ist, die große Binärdateien wie Mediendateien oder Binärdatendateien enthalten müssen. Ohne DIME können Sie natürlich weiterhin Daten in einer SOAP-Nachricht senden. Wenn ich beispielsweise große Mediendateien in einer SOAP-Nachricht an einen anfordernden Client senden möchte, könnte ich dies mit Sicherheit tun, indem ich die binären Anlagen als Base64-XML codiere und sie in den Text der SOAP-Nachricht einfüge. Die Verarbeitung wird jedoch aufgebläht, wenn Anlagen sehr groß sind, und noch schwieriger, wenn sie digital signiert sind. Außerdem kann es kompliziert werden, wenn ich andere SOAP-Nachrichten, XML-Dokumente oder XML-Fragmente senden möchte, die eine andere Zeichencodierung als die Standard SOAP-Nachricht aufweisen. Dies sind einige Szenarien, in denen das Anfügen von Binärdaten an eine SOAP-Nachricht sinnvoller ist.

DIME wurde für die Verwendung mit SOAP-Nachrichten optimiert. Wenn Sie sich auf die Metadaten verlassen, die bereits in einer SOAP-Nachricht vorhanden sind, wird ein DIME-Parser nicht damit belastet, so viele Metadaten in der DIME-Nachricht selbst lesen zu müssen. Dadurch können DIME-Nachrichten schneller und effizienter analysiert werden. Weitere Informationen zu den Vorteilen von DIME gegenüber MIME finden Sie im Artikel von Matt Powell , Grundlegendes zu DIME und WS-Anlagen.

Was sind Webdienstverbesserungen?

Um die Interoperabilität von Webdiensten im Unternehmen zu fördern, haben die wichtigsten Anbieter von XML-Webdiensten (einschließlich Microsoft, IBM und Verisign) neue Spezifikationen vorgeschlagen, die die Interoperabilität in Bereichen verbessern werden, die für Webdienste von entscheidender Bedeutung sind, z. B. Sicherheit, zuverlässiges Messaging und Senden von Anlagen. Um diese neuen vorgeschlagenen Standards zu unterstützen, hat Microsoft Web Services Enhancements (WSE) 1.0 veröffentlicht, das aus einer Reihe von Klassen besteht, die diese neuen Protokolle implementieren, sowie einer Reihe von Filtern, die von Microsoft ASP.NET gehostet werden, die eingehende und ausgehende SOAP-Nachrichten abfangen und die SOAP-Header interpretieren oder generieren, um die angeforderten Funktionen zu unterstützen. WSE 1.0 bietet Unterstützung für die folgenden Spezifikationen:

  • WS-Security
  • Web Services Security Addendum
  • DIME
  • WS-Attachments
  • WS-Routing
  • WS-Referral

Weitere Informationen finden Sie unter Webdiensterweiterungen für Microsoft .NET.

Verwenden von DIME mit Webdiensterweiterungen

WSE v1.0 unterstützt DIME mit SOAP-Anlagen mithilfe von ASP.NET sowie das Lesen und Schreiben von DIME-Nachrichten in und aus einem E/A-Stream. In diesem Abschnitt wird der Prozess zum Hinzufügen einer binären Anlage zu einer SOAP-Nachricht in ASP.NET beschrieben. Später wird die Streamunterstützung für DIME in der WSE erläutert.

Implementieren von DIME durch die WSE-Runtime

Für SOAP-Nachrichten mit Anlagen implementiert die WSE-Runtime einen DIME-konformen Nachrichtenparser, der die Datensätze einer eingehenden DIME-Nachricht übersetzen und die primäre SOAP-Nachricht aus dem ersten DIME-Eintrag sowie alle gekapselten Dateien aus aufeinanderfolgenden Datensätzen als Anlageobjekte extrahieren kann. Nachdem sie aus DIME extrahiert wurde, wird die primäre SOAP-Nachricht an die WSE-Nachrichtenpipeline übergeben, wo die Reiheneingabefilter die SOAP-Nachricht für alle anderen WSE-unterstützten Header auswerten. Die folgende Abbildung zeigt, wie eine eingehende DIME-Nachricht von der WSE-Runtime und ASP.NET behandelt wird.

Abbildung 1. WSE-Runtime und ASP.NET behandeln eingehende DIME-Nachrichten

Für ausgehende SOAP-Antwortnachrichten mit Anlagen erstellt der DIME-Nachrichtenparser im WSE eine neue DIME-Nachricht, wobei der erste DIME-Eintrag die ausgehende SOAP-Antwort ist und alle angegebenen Anlagen in nachfolgenden DIME-Datensätzen gekapselt werden. Die folgende Abbildung zeigt, wie eine DIME-Nachricht von der WSE-Runtime zusammengestellt wird.

Abbildung 2. WSE-Runtime beim Zusammenstellen einer DIME-Nachricht

Eine umfassende API ermöglicht die programmgesteuerte Steuerung der WSE-Runtime und deren Unterstützung für DIME. Objekte im Microsoft.Web.Services.Dime-Namespace bieten Unterstützung für DIME. Für einen SOAP-basierten Webdienst, der von ASP.NET gehostet wird, steuert die SoapContext-Klasse im Microsoft.Web.Services-Namespace das Verhalten der WSE-Laufzeit, indem die Verwendung und die Eigenschaften der erweiterten Webdienstprotokolle für eine bestimmte SOAP-Nachricht angegeben werden. Wenn im WSE-Programmiermodell eine SOAP-Anforderungsnachricht empfangen wird, generiert die Runtime ein HttpSoapContext-Objekt für die eingehende Anforderung. Die HttpSoapContext.RequestContext-Eigenschaft greift auf das SoapContext-Objekt für die Nachricht zu und listet die Informationen auf, die in den WSE-spezifischen Headerelementen der Nachricht enthalten sind.

Wenn eingehende DIME-Nachrichten der WS-Attachments-Spezifikation entsprechen, behandelt die WSE-Runtime sie als SOAP-Nachrichten mit Anlagen und extrahiert dann die primäre SOAP-Nachricht und alle ihre Anlagen. Für jede Anlage wird der DimeAttachmentCollection ein DimeAttachment-Objekt hinzugefügt, auf die über die SoapContext.Attachments-Eigenschaft zugegriffen wird. Ebenso können Anlagen der DimeAttachmentCollection für den SoapContext einer ausgehenden Nachricht hinzugefügt werden, sodass die WSE-Laufzeit sie als DIME-Datensätze in die ausgehende Nachricht einschließt.

Nun sehen wir uns den Prozess zum Erstellen einer Webdienstantwort als DIME-Nachricht mit Anlagen an.

Konfigurieren von Webdiensterweiterungen für DIME

Selbst wenn WSE auf dem ASP.NET Webserver installiert ist, müssen einige zusätzliche DIME-spezifische Konfigurationen an die ASP.NET-Anwendung vorgenommen werden, um Anlagen mit DIME verwenden zu können. Nach dem Erstellen eines neuen ASP.NET Webdienstprojekts in Microsoft® Visual Studio® .NET müssen Dem Projekt Verweise auf die Microsoft.Web.Services.dll assembly hinzugefügt werden. Sie müssen dem soapExtensionTypes-Element auch einen neuen Typ hinzufügen, indem Sie in der Web.config-Datei für das Projekt wie folgt ein neues add-Element hinzufügen:

<configuration>
    <system.web>
      ...
        <webServices>
            <soapExtensionTypes>
                <add type=
                "Microsoft.Web.Services.WebServicesExtension,
                 Microsoft.Web.Services, 
                 Version=1.0.0.0,
                 Culture=neutral,
                 PublicKeyToken=31bf3856ad364e35" 
                priority="1" group="0" />
            </soapExtensionTypes>
        </webServices>
    </system.web>
</configuration>

In diesem Beispiel darf der Wert des Typattributes keine Umbrüche oder zusätzliche Leerzeichen enthalten. Wenn die Elemente webServices und soapExtensionTypes noch nicht vorhanden sind, müssen sie ebenfalls der Web.config-Datei hinzugefügt werden. Eine einfachere Möglichkeit, Ihr WSE-basiertes Projekt für die Verwendung von DIME zu konfigurieren, ist die Installation des WSE-Einstellungstools, ein nicht unterstütztes Add-In für Visual Studio, mit dem Sie problemlos Webdienstprojekte einrichten können, die WSE verwenden.

Hinzufügen von Anlagen zu einer SOAP-Nachricht mithilfe von WSE

Beachten Sie, dass wir über eine Webdienstklasse namens ImageDimeService mit einer öffentlichen Methode verfügen, die eine binäre JPEG-Bilddatei zurückgibt. Auf der CodeBehind-Seite für die ASPX-Datei des Diensts sollten Sie Aliase für diese Namespaces mit der using-Direktive wie folgt erstellen:

using System.Web.Services
using Microsoft.Web.Services
using Microsoft.Web.Services.Dime

In diesem Beispiel wird die ImageDimeService-Klasse wie folgt definiert:

[WebService(Namespace="http://example.com/dime/",
  Description="Web service returns one or more JPEG files using DIME.")]
public class ImageService : System.Web.Services.WebService
{
  ...

Die folgende GetImage-Methode implementiert die WebMethod, die die angeforderten JPEG-Dateien zurückgibt:

[WebMethod]
public string[] GetImage(string[] imageNameCollection)
{
  // Get the SoapContext for the response message
  SoapContext myContext = HttpSoapContext.ResponseContext;

  // Create an array that returns URIs for the related DIME attachments.
  string[] retUri= new string[imageNameCollection.Length];

  int i = 0; // Iterrator

  // Create a DimeAttachment object for each file specified 
  // by the values of the imageID array. 
  Foreach (string imageName in imageNameCollection)
  {
    // String that represents the file name and path for the attachment.
    string filePath = "C:\\images\\" + imageName + ".jpg";
    
    // Create a new DIME attachment using the the file name and 
    // specifying the encoding of the attachment using the MIME media 
    // type of image\jpeg.
    DimeAttachment dimeImage = new DimeAttachment(
      "image/jpeg", TypeFormatEnum.MediaType,
      filePath);

    // Generate a GUID-based URI reference for the attachment object
    // and assign in to the ID property of the DIME record.

    dimeImage.Id = "uri:" + Guid.NewGuid().ToString();

    // Add the new DimeAttachment object to the SoapContext object.
    myContext.Attachments.Add(dimeImage);

    // Add the generated URI to array that is returned.
    retUri[i] = dimeImage.Id;

    i++;

  }

  // Return the array of URIs that match the ID vaules of 
  // the attachments.
  return retUri;
}

In dieser WebMethod enthält die SOAP-Anforderungsnachricht vom Client eine Auflistung von Bildnamen. Für jeden Namen in der Auflistung ruft der Webdienst eine zugeordnete JPEG-Datei aus dem Ordner C:\images ab und fügt das Bild der DimeAttachmentCollection für ResponseContext hinzu. Wenn die WebMethod zurückgibt, macht die WSE-Laufzeit die Antwortnachricht zum primären DIME-Eintrag und jedes DimeAttachment einen nachfolgenden Datensatz in der Reihenfolge, in der sie der DimeAttachmentCollection hinzugefügt wurden.

Extrahieren von Anlagen aus einer DIME-Nachricht

Damit ein Webdienst, der eine Clientanwendung nutzt, DIME-Nachrichten empfangen und verarbeiten kann, muss auch WSE auf dem Client installiert sein. Um die WSE DIME-Unterstützung mit einer Microsoft .NET-Clientanwendung in Visual Studio zu verwenden, müssen Sie einen Verweis für die Microsoft.Web.Services.dll-Assembly hinzufügen. Außerdem müssen Sie nach dem Hinzufügen eines Webverweises zum DIME-basierten Webdienst die Proxyklasse in der Datei References.cs so ändern, dass sie von der Microsoft.Web.Services.WebServicesClientProtocol-Klasse in WSE erbt. Beispielsweise muss der Clientwebdienstproxy, der für den ImageService-Webdienst aus dem vorherigen Beispiel generiert wurde, wie folgt geändert werden:

public class ImageService : Microsoft.Web.Services.WebServicesClientProtocol

Wenn Sie das WSE-Einstellungstool bereits auf dem Client installiert haben, generiert Webverweis hinzufügen automatisch eine separate Proxyklasse mit der Endung "Wse", die bereits von der richtigen WSE-Klasse erbt. In diesem Fall können Sie einfach die ImageServiceWse-Klasse als Dienstproxy verwenden.

Das folgende Beispiel zeigt, wie Sie den ImageService-Webdienst verwenden können, um mehrere JPEG-Dateien als DIME-Anlagen abzurufen.

try 
{
  // Call the Web method passing an array of image names, and
  // capture the URI values in the returned array in case we 
  // need to reference the attachments by ID.
  string[] retUri = myService.GetImage(imageNameCollection);
}
catch (Exception ex)
{
  // Handle any exception errors.;
}

// Check if response message contains any attachments.
if (myService.ResponseSoapContext.Attachments.Count > 0)
{
  // Display each attached JPEG image file.
  for (int i=0; i<myService.ResponseSoapContext.Attachments.Count;i++)
  {
    // Stream the attached image into a new Bitmap object to display.
    Bitmap myImage = new 
      Bitmap(myService.ResponseSoapContext.Attachments[i].Stream);
    
    // Do something with the image.

  }
  // Warn the user if no images were returned.
  MessageBox.Show("No images were returned");
}

In diesem Beispiel wird jede JPEG-Anlage mithilfe der DimeAttachment.Stream-Eigenschaft aus dem Speicher in ein neues Bitmap-Objekt als Datenstrom geschrieben.

Erweiterte DIME-Unterstützung in WSE

WSE ermöglicht es Ihnen zwar, Anlagen problemlos mit ausgehenden SOAP-Nachrichten zu kapseln, aber die WSE-Unterstützung für DIME bietet einige erweiterte Funktionen, die ich in diesem Abschnitt erläutern werde.

Blockieren großer Anlagen

Wie Sie vielleicht in meinem vorherigen Artikel über DIME im MSDN Magazine gesehen haben, unterstützt die DIME-Spezifikation die Möglichkeit, große Anlagen in mehrere Datensätze aufzuteilen, was bei sehr großen Anlagen nützlich ist. Die Theorie hinter Blöcken besteht darin, dass Sie beim Aufteilen einer großen Anlage in Blöcke nicht die gesamte Anlage puffern müssen, um sie in einen einzelnen DIME-Datensatz zu schreiben. Mit WSE können Sie die Blockgröße von Anlagen in Bytes angeben, indem Sie die DimeAttachment.ChunkSize-Eigenschaft festlegen. Da ASP.NET WebMethods jedoch kein Streaming unterstützen, wird bei Verwendung von WSE mit ASP.NET die gesamte DIME-Nachricht im Arbeitsspeicher gepuffert, was die Nützlichkeit von Blöcken in dieser Implementierung einschränkt. Eine bessere Methode zum Transport großer Anlagen mithilfe von DIME ist das Streamen von DIME über einen geeigneten Transport.

Streamen von Daten mithilfe von DimeReader und DimeWriter

Während DIME ein nachrichtenbasiertes Format ist, können DIME-Datensätze durch die Tatsache, dass DIME-Datensätze serialisiert und aufgeteilt werden können, effektiv über Transportprotokolle auf Paketebene wie TCP und UDP verwendet werden. WSE 1.0 unterstützt das Streaming von DIME-Nachrichten zu und von System.IO.Stream-Objekten wie NetworkStream, anstatt durch ein nachrichtenbasiertes Protokoll wie HTTP eingeschränkt zu werden. Beim Streaming als DIME teilt die WSE-Runtime die ausgehenden DIME-Datensätze auf, sodass die Datensatzgröße des gestreamten Objekts nicht definiert werden muss. Der letzte Datensatzblock wird geschrieben, wenn das Ende des Datenstroms erreicht ist. Im folgenden Beispiel wird ein Eingabestream aus einer Datei (z. B. eine große Binärbilddatei) entnommen, der Stream in eine Reihe von dime-Datensätzen geschrieben und die DIME-Nachricht in ein Stream-Objekt geschrieben, bei dem es sich um ein NetworkStream-Objekt über TCP handeln kann:

// Sample transforms a binary input stream to a DIME stream of specified 
// MIME media-type.
static void WriteToDime(Stream inputStr,Stream dimeStr,string mediaType)
{
  // create writer for DIME message out to the dimeStream
  DimeWriter myDW = new DimeWriter(dimeStr);

  // Create a GUID for the DIME record ID.
  Guid guid = Guid.NewGuid();
  string id = string.Format("uuid:{0}", guid.ToString());

  // Create a new DIME record where the MIME media type is specified
  // by mediaType and contentLength of -1 to specify chunking.
  DimeRecord myRecord = myDW.LastRecord(id, mediaType, 
    TypeFormatEnum.MediaType, -1);

  // Set a rather small size for each record chunk at 4KB.
  myRecord.ChunkSize = 4096;

  // Use BinaryWriter to write a stream to the DimeRecord.
  BinaryWriter myWriter = new BinaryWriter(myRecord.BodyStream);

  // Write bytes from incoming stream to BinaryWriter.
  int size = 4096;
  byte[] bytes = new byte[4096];
  int numBytes;
  while((numBytes = inputStr.Read(bytes, 0, size)) > 0)
  {
    myWriter.Write(bytes, 0, numBytes);
  }

  // Cleanup
  myDW.Close();
}

Im Gegensatz zu einer SOAP-basierten Implementierung von DIME, bei der die gesamte DIME-Nachricht in den Arbeitsspeicher eingelesen wird, können Sie beim Streaming an DIME dimeRecord.ChunkSize verwenden, um die Menge an Arbeitsspeicher zu begrenzen, die Sie verwenden müssen.

Die folgende Methode implementiert die entgegengesetzte Prozedur, nämlich das Lesen eines DIME-Datenstroms und das Extrahieren des Datensatzinhalts in einen binären Stream.

static void ReadFromDime(Stream dimeStr, Stream outStr)
{
  // Create a reader for the streamed DIME message.
  DimeReader myDR = new DimeReader(dimeStr);

  // Create a DimeRecord to read the current (and only) DIME record.
  DimeRecord myRecord = myDR.ReadRecord();

  // Create a reader to read the record contents into.
  BinaryReader myReader = new BinaryReader(myRecord.BodyStream);

  // Write bytes to the output stream.
  int size = 4096;
  byte[] bytes = new byte[4096];
  int numBytes;
  while((numBytes = myReader.Read(bytes, 0, size)) > 0)
  {
    outStr.Write(bytes, 0, numBytes);
  }
  
  // cleanup
  myReader.Close();
  myDR.Close();
}

Probleme bei der Verwendung von WSE für DIME

Wie bei jedem Produkt der Version 1.0 gibt es einige Einschränkungen bei der Unterstützung von DIME, WS-Attachment und zugehörigen Spezifikationen. Diese Probleme sind wie folgt:

Schützen von Anlagen

WSE bietet zwar umfassende Unterstützung für den Schutz von SOAP-Nachrichten gemäß den WS-Sicherheitsspezifikationen, aber diese Unterstützung erstreckt sich nicht auf Anlagen zu SOAP-Nachrichten, die in einer DIME-Nachricht gesendet werden. Wenn Sie WSE anweisen, die primäre SOAP-Nachricht zu signieren und zu verschlüsseln, wird die SOAP-Nachricht durch den WSE SecurityOutputFilter weitergeleitet, wo sie entsprechend geschützt wird. Erst nach dem Durchlaufen der verschiedenen Filter wird die SOAP-Nachricht als DIME-Nachricht mit den Anlagen gekapselt, was bedeutet, dass die Anlagen selbst in keiner Weise geschützt sind, da sie von jedem DIME-Parser gelesen werden können.

Wenn Sie die Anlagen in DIME-Nachrichten schützen müssen, sollten Sie einen der .NET Framework unterstützten Verschlüsselungsmechanismen verwenden, die vom System.Security.Cryptography-Namespace bereitgestellt werden. Da die DIME-Spezifikation derzeit keine Methode zum Signieren von DIME-Nachrichtenheadern definiert, kann WSE auch nicht ermitteln, ob DIME-Nachrichten manipuliert wurden. Insbesondere können Sie eine href verwenden, um eine bestimmte Anlagen-ID anzugeben. Es gibt keine integrierte Unterstützung in der WSE, um zu überprüfen, ob ein Mittelsmann die ID nicht geändert hat und den Verweis auf etwas völlig anderes verweist. Wenn Sie dime zum Transport vertraulicher Daten verwenden, sollten Sie daher immer den Stream schützen oder einen geschützten Transport verwenden.

Verweisen auf Anlagen

WSE unterstützt das ID-Feld für DIME-Einträge, das mithilfe der DimeAttachment.Id-Eigenschaft festgelegt werden kann. Dadurch können Sie Anlagen mithilfe von benutzerfreundlichen ID-Zeichenfolgenwerten anstelle ganzzahliger Indexwerte zuweisen und darauf zugreifen. Sie können beispielsweise auf eine Anlage mit der ID tom zugreifen, indem Sie einfach ["Tom"] anstelle des Arrayindexes [0] wie folgt angeben:

myService.ResponseSoapContext.Attachment["Tom"];

Technisch gesehen sollte die ID ein URI sein, aber dies wird nicht von WSE erzwungen.

Die WS-Attachment Spezifikation schreibt vor, dass auf Anlagen aus der primären SOAP-Nachricht durch die ID-Werte des DIME-Datensatzes verwiesen wird, in dem sie enthalten sind. Dies ist, um die Leistung von DIME-Parsern zu verbessern, indem sie die primäre SOAP-Nachricht lesen und dann schnell eine Anlage suchen, indem nur Datensatzheader analysiert werden, bis der gewünschte Datensatz gefunden wird. In dieser ersten Version von WSE hat Microsoft jedoch eine autonomere Ansicht von Anlagen übernommen, was bedeutet, dass die WSE-Runtime nur jede Anlage in der empfangenen Reihenfolge extrahiert und jedes als Objekt im Arbeitsspeicher behält, auf das bei Bedarf zugegriffen werden kann. Im vorherigen Beispiel habe ich auf die Anlagen verwiesen, indem ich einen URI-ID-Wert für jede Anlage in der Auflistung angegeben habe, und dann eine Auflistung dieser URI-Werte im Textkörper der Nachricht zurückgegeben.

Keine WSDL-Unterstützung für DIME

Obwohl die WSDL-Erweiterung für SOAP in der DIME-Spezifikation eine Methode zur Unterstützung von DIME in der Web Services Description Language (WSDL) enthält, enthält WSE keine Updates für die WSDL-Generierungsfunktionalität in ASP.NET oder für das Wsdl.exe-Tool. Dies bedeutet, dass Sie die WSDL-Datei gemäß dieser neuen Spezifikation manuell bearbeiten und veröffentlichen müssen, um die Tatsache zu veröffentlichen, dass ein Webdienst DIME unterstützt. Obwohl die Beschreibung der DIME-Funktionalität in WSDL der richtige Weg ist, ist eine vollständige Beschreibung nicht wirklich erforderlich, da Sie das SoapContext-Objekt problemlos in eingehenden Nachrichten überprüfen können, um festzustellen, ob Anlagen enthalten waren.

SOAP Toolkit 3.0 Interoperabilität

Da sowohl WSE als auch das Microsoft® SOAP Toolkit 3.0 die WS-Attachments Spezifikation unterstützen, können DIME-Nachrichten, die eine SOAP-Nachricht mit Anlagen enthalten, zwischen diesen beiden Runtimes erstellt und gelesen werden. In der Tat bietet das SOAP-Toolkit eine vollständigere Implementierung der WS-Attachments-Spezifikation mit Unterstützung für den Verweis auf Anlagen aus den primären SOAP-Nachrichten, und das SOAP Toolkit 3.0 enthält ein aktualisiertes WSDL Generator-Tool (Wsdlgen3.exe), das WSDL-Dateien erzeugt, die der vorgeschlagenen WSDL-Erweiterung für SOAP in DIME-Spezifikation entsprechen. WSE unterstützt solche Beschreibungen für DIME-basierte Webdienste nicht.

In einem solchen Interoperabilitätsszenario müssen Sie watch, indem Sie die vom SOAP-Toolkit bereitgestellte allgemeine API verwenden, um einen WSE-basierten Webdienst mit Anlagen zu nutzen. Da die allgemeine API eine WSDL-Datei verwendet, um die erforderlichen Verbindungsobjekte zum Marshallen der Kommunikation zwischen Client und Webdienst zu generieren, müssen Sie die WSDL-Datei für den WSE-basierten Webdienst manuell ändern und veröffentlichen, um die fehlenden <untergeordneten Elemente dime:message> den <Elementen wsdl:input> und<wsdl:output> hinzuzufügen, wie in der WSDL-Erweiterungsspezifikation definiert. Soap Toolkit 3.0 verarbeitet jedoch nur DIME-Nachrichten, die den WS-Attachments-Spezifikationen entsprechen, was bedeutet, dass es nicht wie WSE zum Streamen von Daten verwendet werden kann.

Zusammenfassung

Webdiensterweiterungen für Microsoft .NET bietet die umfassendste Lösung zum Senden und Empfangen von Anlagen mit SOAP-Nachrichten. Zusätzlich zur DIME-Unterstützung hostet die WSE-Runtime auch die Prozessfilterpipeline, mit der Sie WSE-unterstützte Header in der primären SOAP-Nachricht der DIME-Nachricht problemlos verarbeiten können. Die WSE unterstützt auch eine nicht SOAP-basierte Implementierung von DIME, mit der Sie DIME verwenden können, um Daten als Eine Reihe von DIME-Datensätzen zu streamen.