Verwenden von Web Services Enhancements zum Senden von SOAP-Nachrichten mit Anlagen

Veröffentlicht: 10. Apr 2003 | Aktualisiert: 22. Jun 2004
Von Jeannine Hall Gailey

WS-Attachments ist ein vorgeschlagener Web Service-Standard, der auf das DIME-Nachrichtenkapselungsprotokoll zurückgreift. Dieses Protokoll wurde dazu konzipiert, das Senden von Anlagen mit SOAP-Nachrichten zu erleichtern. Dieser Artikel beschreibt, wie das neue Web Services Enhancements (WSE) 1.0 für Microsoft .NET das Senden von Anlagen mithilfe der DIME- und WS-Attachments-Spezifikation unterstützt.

Auf dieser Seite

Einführung Einführung
Worum handelt es sich bei Web Services Enhancements? Worum handelt es sich bei Web Services Enhancements?
Verwenden von DIME mit Web Service Enhancements Verwenden von DIME mit Web Service Enhancements
Wie die WSE-Laufzeit DIME implementiert Wie die WSE-Laufzeit DIME implementiert
Konfigurieren der Web Services Enhancements für DIME Konfigurieren der Web Services Enhancements für DIME
Hinzufügen von Anlagen zu einer SOAP-Nachricht mithilfe von WSE Hinzufügen von Anlagen zu einer SOAP-Nachricht mithilfe von WSE
Extrahieren von Anlagen aus einer DIME-Nachricht Extrahieren von Anlagen aus einer DIME-Nachricht
Erweiterte DIME-Unterstützung in WSE Erweiterte DIME-Unterstützung in WSE
Chunking von großen Anlagen Chunking von großen Anlagen
Streamen von Daten mithilfe von "DimeReader" und "DimeWriter" Streamen von Daten mithilfe von "DimeReader" und "DimeWriter"
Probleme beim Verwenden von WSE für DIME Probleme beim Verwenden von WSE für DIME
Sichern von Anlagen Sichern von Anlagen
Verweisen auf Anlagen Verweisen auf Anlagen
Keine WSDL-Unterstützung für DIME Keine WSDL-Unterstützung für DIME
Interoperabilität mit SOAP Toolkit 3.0 Interoperabilität mit SOAP Toolkit 3.0
Schlussfolgerung Schlussfolgerung

Einführung

WS-Attachments schreibt eine Methode vor, die DIME (Direct Internet Message Encapsulation) zum Senden und Empfangen von SOAP-Nachrichten mit zusätzlichen Anlagen, wie z.B. binären Dateien, XML-Fragmenten und sogar anderen SOAP-Nachrichten, verwendet. DIME basiert auf einer Spezifikation, die von Microsoft und IBM der Internet Engineering Task Force (IETF) vorgelegt wurde, und ist zum Einkapseln einer SOAP-Nachricht und der zugehörigen Anlagen auf eine MIME-ähnliche Art konzipiert. Wie bei SOAP können DIME-Nachrichten mit Standardtransportprotokollen wie HTTP, TCP und UDP gesendet werden. DIME unterstützt das Datenstreaming. DIME kann sogar ohne SOAP verwendet werden, obwohl die Fähigkeit von DIME, den Inhalt der Nachricht in dieser Instanz zu beschreiben, beschränkt ist.

Microsoft hat sich dazu entschieden, DIME und WS-Attachments in der ersten Version von Web Services Enhancements (WSE), einer Lösung zum Entwickeln von sicheren, robusten und skalierbaren Web Services mithilfe von Microsoft .NET, zu unterstützen. Dieser Artikel befasst sich in erster Linie mit der Implementierung von DIME und nicht mit dem Protokoll selbst. Weitere Erläuterungen zum DIME-Protokoll finden Sie in meinem Artikel zu DIME (in Englisch) in der Dezemberausgabe des MDSN Magazine.

Obwohl DIME nicht ausschließlich auf die Verwendung mit SOAP beschränkt ist, ist es hauptsächlich zum effizienten Transportieren von Anlagen mit SOAP-Nachrichten konzipiert. Es eignet sich daher besonders für Web Services, die große Binärdateien, wie z.B. Mediendateien oder binäre Datendateien, einschließen müssen. Sie können natürlich auch ohne DIME Daten in einer SOAP-Nachricht senden. Wenn ich z.B. große Mediendateien in einer SOAP-Nachricht an einen anfordernden Client senden möchte, besteht eine Möglichkeit darin, die binären Anlagen als Base64-XML zu codieren und sie in den Textteil der SOAP-Nachricht einzuschließen. Die Verarbeitung ist jedoch bei sehr großen Anlagen viel aufwändiger und bei digital signierten Anlagen noch komplizierter. Auch kann das Senden von anderen SOAP-Nachrichten, XML-Dokumenten oder XML-Fragmenten mit einer anderen Zeichencodierung als derjenigen der SOAP-Hauptnachricht Schwierigkeiten bereiten. Bei diesen Szenarios ist es sinnvoller, binäre Daten an eine SOAP-Nachricht anzuhängen.

DIME wurde für die Verwendung mit SOAP-Nachrichten optimiert. Durch Verwendung der bereits in einer SOAP-Nachricht vorhandenen Metadaten muss ein DIME-Parser nicht so viele Metadaten in der DIME-Nachricht selbst durchlesen. Deshalb können DIME-Nachrichten schneller und effizienter analysiert werden. Weitere Informationen zu den Vorteilen von DIME gegenüber MIME finden Sie im Artikel Grundlegendes zu DIME und WS-Attachments von Matt Powell.

Worum handelt es sich bei Web Services Enhancements?

Um die Web Service-Interoperabilität in Unternehmen zu fördern, haben die Hauptprotagonisten im Bereich XML Web Services (darunter Microsoft, IBM und VeriSign) neue Spezifikationen vorgeschlagen, die die Interoperabilität in den für Web Services essenziellen Bereichen, wie z.B. Sicherheit, zuverlässiges Messaging und Senden von Anlagen, verbessern sollen. Zur Unterstützung dieser neuen vorgeschlagenen Standards hat Microsoft Web Services Enhancements (WSE) 1.0 veröffentlicht. Dieses Produkt besteht aus einer Reihe von Klassen, die diese neuen Protokolle implementieren, sowie aus einer Reihe von Filtern, die von Microsoft ASP.NET gehostet werden. Diese fangen die ein- und ausgehenden SOAP-Nachrichten ab und interpretieren oder generieren die zur Unterstützung dieser geforderten Funktionen benötigten SOAP-Header. WSE 1.0 unterstützt die folgenden Spezifikationen:

  • WS-Security

  • Web Services Security Addendum

  • DIME

  • WS-Attachments

  • WS-Routing

  • WS-Referral

Weitere Informationen finden Sie unter Web Services Enhancements for Microsoft .NET (in Englisch).

Verwenden von DIME mit Web Service Enhancements

WSE v1.0 unterstützt DIME mit SOAP-Anlagen unter Verwendung von ASP.NET sowie das Lesen und Schreiben von DIME-Nachrichten in einen und aus einem E/A-Stream. In diesem Abschnitt werden wir schrittweise eine binäre Anlage an eine SOAP-Nachricht in ASP.NET hinzufügen. Anschließend werden wir die Streamunterstützung für DIME in WSE behandeln.

Wie die WSE-Laufzeit DIME implementiert

Bei SOAP-Nachrichten mit Anlagen implementiert die WSE-Laufzeit einen DIME-konformen Nachrichtenparser, der die Datensätze einer eingehenden DIME-Nachricht übersetzen sowie die primäre SOAP-Nachricht vom ersten DIME-Datensatz und alle eingekapselten Dateien von nachfolgenden Datensätzen als Anlagenobjekte extrahieren kann. Nach der Extrahierung von DIME wird die primäre SOAP-Nachricht an die WSE-Nachrichtenpipeline übergeben, wo die Serieneingabefilter die SOAP-Nachricht auf andere WSE-unterstützte Header überprüfen. Die folgende Abbildung zeigt, wie eine eingehende DIME-Nachricht von der WSE-Laufzeit und ASP.NET verarbeitet wird.


wsedime_01.gif

Abbildung 1. WSE-Laufzeit und ASP.NET verarbeiten eingehende DIME-Nachricht


Bei ausgehenden SOAP-Antwortnachrichten mit Anlagen erstellt der DIME-Nachrichtenparser in WSE eine neue DIME-Nachricht, wobei der erste DIME-Datensatz die ausgehende SOAP-Antwort ist und alle angegebenen Anlagen in nachfolgenden DIME-Datensätzen eingekapselt werden. Die folgende Abbildung zeigt, wie eine DIME-Nachricht von der WSE-Laufzeit zusammengesetzt wird.


wsedime_02.gif

Abbildung 2. WSE-Laufzeit setzt eine DIME-Nachricht zusammen


Eine Rich-API ermöglicht die programmtechnische Steuerung der WSE-Laufzeit und deren Unterstützung für DIME. Objekte im Microsoft.Web.Services.Dime-Namespace bieten Unterstützung für DIME. Bei einem SOAP-basierten Web Service, der von ASP.NET gehostet wird, steuert die SoapContext-Klasse im Microsoft.Web.Services-Namespace das Verhalten der WSE-Laufzeit durch Angabe der Verwendung und der Eigenschaften der erweiterten Web Service-Protokolle für die jeweilige SOAP-Nachricht. Beim WSE-Programmiermodell generiert die Laufzeit beim Empfangen einer SOAP-Anforderungsnachricht 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 in den WSE-spezifischen Headerelementen der Nachricht enthaltenen Informationen auf.

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

Führen wir nun die einzelnen Schritte für das Erstellen einer Web Service-Antwort als DIME-Nachricht mit Anlagen aus.

Konfigurieren der Web Services Enhancements für DIME

Selbst wenn WSE auf dem ASP.NET-Webserver installiert ist, gibt es einige zusätzliche DIME-spezifische Konfigurationen, die an der ASP.NET-Anwendung vorgenommen werden müssen, um Anlagen mit DIME verwenden zu können. Nach dem Erstellen eines neuen ASP.NET-Web Service-Projekts in Microsoft® Visual Studio® .NET müssen Verweise auf die Microsoft.Web.Services.dll-Assembly zum Projekt hinzugefügt werden. Sie müssen auch einen neuen Typ zum soapExtensionTypes-Element hinzufügen, indem Sie folgendermaßen ein neues add-Element in der Datei Web.config für das Projekt 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 type-Attributs keine Umbrüche oder zusätzliche Leerzeichen enthalten. Wenn die webServices- und soapExtensionTypes-Elemente nicht bereits vorhanden sind, müssen sie ebenfalls zur Datei Web.config hinzugefügt werden. Eine einfachere Methode zum Konfigurieren des WSE-basierten Projekts für die Verwendung von DIME besteht darin, das Tool WSE Settings zu installieren. Dabei handelt es sich um ein nicht unterstütztes Add-In für Visual Studio, mit dem Sie leicht Web Service-Projekte einrichten können, die WSE verwenden.

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

Angenommen, wir verfügen über eine Web Service-Klasse mit dem Namen ImageDimeService mit einer öffentlichen Methode, die eine binäre JPEG-Bilddatei zurückgibt. Auf der CodeBehind-Seite für die ASPX-Datei des Web Service 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 ist die ImageDimeService-Klasse wie folgt definiert:

[WebService(Namespace="<A href="http://example.com/dime/">http://example.com/dime/</A>", 
  Description="Web Service gibt eine oder mehrere JPEG-Dateien mithilfe von DIME zurück.")] 
public class ImageService : System.Web.Services.WebService 
{ 
  ...

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

[WebMethod] 
public void GetImage(string[] imageNameCollection) 
{ 
  // SoapContext für die Antwortnachricht abrufen 
  SoapContext myContext = HttpSoapContext.ResponseContext; 
  // Array erstellen, das URIs für die zugehörigen DIME-Anlagen zurückgibt. 
  string[] retUri= new string[imageNameCollection.Length]; 
  int i = 0; // Iterator 
  // DimeAttachment-Objekt für jede angegebene Datei  
  // gemäß den Werten des imageID-Arrays erstellen.  
  Foreach (string imageName in imageNameCollection) 
  { 
 // Zeichenfolge, die den Dateinamen und Pfad der Anlage darstellt. 
 string filePath = "javascript:void(null);" + imageName + ".jpg"; 
 // Neue DIME-Anlage unter Verwendung des Dateinamens und  
 // Angeben der Codierung der Anlage mithilfe des MIME-Medientyps  
 // image\jpeg erstellen. 
 DimeAttachment dimeImage = new DimeAttachment( 
   "image/jpeg", TypeFormatEnum.MediaType, 
   filePath); 
 // GUID-basierten URI-Verweis für das Anlagenobjekt generieren 
 // und der ID-Eigenschaft des DIME-Datensatzes zuweisen. 
 dimeImage.Id = "uri:" + Guid.NewGuid().ToString(); 
 // Neues DimeAttachment-Objekt zum SoapContext-Objekt hinzufügen. 
 myContext.Attachments.Add(dimeImage); 
 // Generierten URI zum zurückgegebenen Array hinzufügen. 
 retUri[i] = dimeImage.Id; 
 i++; 
  } 
  // Array von URIs zurückgeben, die mit den ID-Werten  
  // der Anlagen übereinstimmen. 
  return retUri; 
}

Bei dieser WebMethod enthält die SOAP-Anforderungsnachricht vom Client eine Auflistung von Bildnamen. Für jeden Namen in der Auflistung ruft der Web Service eine verknüpfte JPEG-Datei vom Ordner C:\images ab und fügt das Bild zur DimeAttachmentCollection für den ResponseContext hinzu. Wenn die WebMethod das Ergebnis zurückgibt, macht die WSE-Laufzeit die Antwortnachricht zum primären DIME-Datensatz und jede DimeAttachment zu einem nachfolgenden Datensatz und zwar in der Reihenfolge, in der sie zur DimeAttachmentCollection hinzugefügt wurden.

Extrahieren von Anlagen aus einer DIME-Nachricht

Damit ein Web Service, der eine Clientanwendung verwendet, DIME-Nachrichten empfangen und verarbeiten kann, muss WSE auch auf dem Client installiert sein. Um die WSE-DIME-Unterstützung bei einer Microsoft .NET-Clientanwendung in Visual Studio zu verwenden, müssen Sie einen Verweis auf die Microsoft.Web.Services.dll-Assembly hinzufügen. Nach dem Hinzufügen eines Webverweises zum DIME-basierten Web Service müssen Sie die Proxyklasse in der Datei References.cs so ändern, dass sie von der Microsoft.Web.Services.WebServicesClientProtocol-Klasse in WSE erbt. So muss z.B. der Client-Web Service-Proxy, der für den ImageService-Web Service aus dem vorherigen Beispiel erstellt wurde, folgendermaßen geändert werden:

 public class ImageService : Microsoft.Web.Services.WebServicesClientProtocol

Wenn Sie zuvor das Tool WSE Settings auf dem Client installiert haben, erstellt Webverweis hinzufügen automatisch eine separate Proxyklasse, die mit Wse endet und die bereits von der passenden WSE-Klasse erbt. In diesem Fall können Sie einfach die ImageServiceWse-Klasse als Dienstproxy verwenden.

Das folgende Beispiel veranschaulicht, wie Sie den Web Service ImageService zum Abrufen mehrerer JPEG-Dateien als DIME-Anlagen verwenden können.

try  
{ 
  // Webmethode durch Übergeben eines Arrays von Bildnamen aufrufen und 
  // URI-Werte im zurückgegebenen Array erfassen für den Fall, dass  
  // wir auf die Anlagen nach ID verweisen müssen. 
  string[] retUri = myService.GetImage(imageNameCollection); 
} 
catch (Exception ex) 
{ 
  // Ausnahmefehler behandeln.; 
} 
// Überprüfen, ob Antwortnachricht Anlagen enthält. 
if (myService.ResponseSoapContext.Attachments.Count > 0) 
{ 
  // Alle angehängten JPEG-Bilddateien anzeigen. 
  for (int i=0; i<myService.ResponseSoapContext.Attachments.Count;i++) 
  { 
 // Angehängtes Bild in neues Bitmap-Objekt zum Anzeigen streamen. 
 Bitmap myImage = new  
   Bitmap(myService.ResponseSoapContext.Attachments[i].Stream); 
 // Aktion an Bild durchführen. 
  } 
  // Benutzer warnen, falls keine Bilder zurückgegeben wurden. 
  MessageBox("No images were returned"); 
} 
try  
{ 
  // Webmethode durch Übergeben eines Arrays von Bildnamen aufrufen und 
  // URI-Werte im zurückgegebenen Array erfassen für den Fall, dass  
  // wir auf die Anlagen nach ID verweisen müssen. 
  string[] retUri = myService.GetImage(imageNameCollection); 
} 
catch (Exception ex) 
{ 
  // Ausnahmefehler behandeln.; 
} 
// Überprüfen, ob Antwortnachricht Anlagen enthält. 
if (myService.ResponseSoapContext.Attachments.Count > 0) 
{ 
  // Alle angehängten JPEG-Bilddateien anzeigen. 
  for (int i=0; i<myService.ResponseSoapContext.Attachments.Count;i++) 
  { 
 // Angehängtes Bild in neues Bitmap-Objekt zum Anzeigen streamen. 
 Bitmap myImage = new  
   Bitmap(myService.ResponseSoapContext.Attachments[i].Stream); 
 // Aktion an Bild durchführen. 
  } 
  // Benutzer warnen, falls keine Bilder zurückgegeben wurden. 
  MessageBox("No images were returned"); 
}

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

Erweiterte DIME-Unterstützung in WSE

Während Sie mit WSE leicht Anlagen in ausgehende SOAP-Nachrichten einkapseln können, bietet die WSE-Unterstützung für DIME erweiterte Funktionen, auf die ich in diesem Abschnitt eingehen möchte.

Chunking von großen Anlagen

Wie Sie vielleicht von meinem früheren Artikel zu DIME (in Englisch) im MSDN Magazine wissen, unterstützt die DIME-Spezifikation die Möglichkeit, große Anlagen in mehrere Datensätze aufzuteilen, was vor allem bei sehr großen Anlagen nützlich ist. Die Theorie hinter Chunking geht davon aus, dass durch das Zerlegen einer großen Anlage in kleinere Chunks nicht die gesamte Anlage gepuffert werden muss, um sie in einen einzelnen DIME-Datensatz zu schreiben. Mit WSE können Sie die Chunkinggröße von Anlagen in Byte durch Festlegen der DimeAttachment.ChunkSize-Eigenschaft angeben. Da jedoch ASP.NET-WebMethods Streaming nicht unterstützen, wird die gesamte DIME-Nachricht beim Verwenden von WSE mit ASP.NET im Arbeitsspeicher gepuffert, was die Nützlichkeit des Chunking in dieser Implementierung einschränkt. Eine bessere Methode für das Transportieren von großen Anlagen mithilfe von DIME besteht darin, DIME über einen geeigneten Transport zu streamen.

Streamen von Daten mithilfe von "DimeReader" und "DimeWriter"

Obwohl DIME ein nachrichtenbasiertes Format ist, kann es aufgrund der Tatsache, dass DIME-Datensätze serialisiert und in Chunks aufgeteilt werden können, effektiv über Transportprotokolle auf Paketebene, wie TCP und UDP, eingesetzt werden. WSE 1.0 unterstützt das Streaming von DIME-Nachrichten zu und von System.IO.Stream-Objekten wie NetworkStream und wird nicht von einem nachrichtenbasierten Protokoll wie z.B. HTTP eingeschränkt. Beim Streaming als DIME zerlegt die WSE-Laufzeit die ausgehenden DIME-Datensätze derart in Chunks, dass die Datensatzgröße des gestreamten Objekts nicht definiert werden muss. Der letzte Datensatzchunk wird geschrieben, wenn das Ende des Streams erreicht wird. Das folgende Beispiel verwendet einen Eingabestream von einer Datei (wie z.B. einer großen binären Bilddatei), schreibt den Stream in eine Reihe von aufgeteilten DIME-Datensätzen und schreibt die DIME-Nachricht in ein Stream-Objekt, das ein NetworkStream über TCP sein kann:

// Beispiel wandelt einen binären Eingabestream in einen DIME-Stream des angegebenen 
// MIME-Medientyps um. 
static void WriteToDime(Stream inputStr,Stream dimeStr,string mediaType) 
{ 
  // Schreiber für DIME-Nachricht an dimeStream erstellen 
  DimeWriter myDW = new DimeWriter(dimeStr); 
  // GUID für DIME-Datensatz-ID erstellen. 
  Guid guid = Guid.NewGuid(); 
  string id = string.Format("uuid:{0}", guid.ToString()); 
  // Neuen DIME-Datensatz erstellen, in dem der MIME-Medientyp 
  // mit mediaType und einer contentLength von -1 angegeben ist, um Chunking festzulegen. 
  DimeRecord myRecord = myDW.LastRecord(id, mediaType,  
 TypeFormatEnum.MediaType, -1); 
  // Relativ kleine Größe für jeden Datensatzchunk mit 4 KB festlegen. 
  myRecord.ChunkSize = 4096; 
  // BinaryWriter zum Schreiben eines Streams in den DimeRecord verwenden. 
  BinaryWriter myWriter = new BinaryWriter(myRecord.BodyStream); 
  // Byte von eingehendem Stream in BinaryWriter schreiben. 
  int size = 4096; 
  byte[] bytes = new byte[4096]; 
  int numBytes; 
  while((numBytes = inputStr.Read(bytes, 0, size)) > 0) 
  { 
 myWriter.Write(bytes, 0, numBytes); 
  } 
  // Bereinigen 
  myDW.Close(); 
}

Im Gegensatz zu einer SOAP-basierten Implementierung von DIME, bei der die gesamte DIME-Nachricht in den Arbeitsspeicher gelesen wird, können Sie beim Streaming in DIME DimeRecord.ChunkSize verwenden, um die verwendete Menge an Arbeitsspeicher einzuschränken.

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

static void ReadFromDime(Stream dimeStr, Stream outStr) 
{ 
  // Leser für die gestreamte DIME-Nachricht erstellen. 
  DimeReader myDR = new DimeReader(dimeStr); 
  // DimeRecord zum Lesen des aktuellen (und einzigen) DIME-Datensatzes erstellen. 
  DimeRecord myRecord = myDR.ReadRecord(); 
  // Leser zum Einlesen des Datensatzinhalts erstellen. 
  BinaryReader myReader = new BinaryReader(myRecord.BodyStream); 
  // Byte in Ausgabestream schreiben. 
  int size = 4096; 
  byte[] bytes = new byte[4096]; 
  int numBytes; 
  while((numBytes = myReader.Read(bytes, 0, size)) > 0) 
  { 
 outStr.Write(bytes, 0, numBytes); 
  } 
  // Bereinigen 
  myReader.Close(); 
  myDR.Close(); 
}

Probleme beim Verwenden von WSE für DIME

Wie bei jedem Produkt der Version 1.0 gibt es einige Einschränkungen in der Art, in der WSE DIME, WS-Attachment und verwandte Spezifikationen unterstützt. Folgende Probleme treten auf:

Sichern von Anlagen

Obwohl WSE umfassende Unterstützung für das Sichern von SOAP-Nachrichten entsprechend den WS-Security-Spezifikationen (in Englisch) bietet, erstreckt sich diese Unterstützung nicht auf Anlagen von SOAP-Nachrichten, die in einer DIME-Nachricht gesendet werden. Wenn Sie WSE anweisen, die primäre SOAP-Nachricht zu signieren und verschlüsseln, wird die SOAP-Nachricht durch den SecurityOutputFilter von WSE geleitet, wo sie entsprechend gesichert wird. Die SOAP-Nachricht wird erst dann als DIME-Nachricht mit den Anlagen eingekapselt, wenn sie die verschiedenen Filter durchlaufen hat, was bedeutet, dass die Anlagen selbst in keinster Weise gesichert sind, da sie von jedem beliebigen DIME-Parser gelesen werden können.

Wenn Sie die Anlagen in DIME-Nachrichten sichern müssen, sollten Sie einen der von .NET Framework unterstützten Verschlüsselungsmechanismen verwenden, die vom
System.Security.Cryptography-Namespace bereitgestellt werden. Da die DIME-Spezifikation gegenwärtig keine Methode zum Signieren von DIME-Nachrichtenheadern definiert, kann WSE nicht feststellen, ob DIME-Nachrichten manipuliert wurden. Sie können ein href verwenden, um eine bestimmte Anlage-ID anzugeben. In WSE gibt es keine integrierte Unterstützung, um zu überprüfen, ob eine unbefugte Person die ID geändert und den Verweis auf eine ganz andere Stelle gerichtet hat. Wenn Sie DIME zum Transportieren von vertraulichen Daten verwenden, sollten Sie deshalb den Stream immer sichern oder einen gesicherten Transport verwenden.

Verweisen auf Anlagen

WSE unterstützt das ID-Feld für DIME-Datensätze, das mithilfe der DimeAttachment.Id-Eigenschaft festgelegt werden kann. Damit können Sie Anlagen mithilfe von ID-Zeichenfolgenwerten anstelle von ganzzahligen Indexwerten zuweisen und darauf zugreifen. So können Sie z.B. auf eine Anlage mit der ID Tom zugreifen, indem Sie einfach ["Tom"] anstelle des Arrayindex [0] angeben:

myService.ResponseSoapContext.Attachment["Tom"];

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

Die WS-Attachment-Spezifikation schreibt vor, dass auf Anlagen von der primären SOAP-Nachricht aus über die ID-Werte des DIME-Datensatzes, in dem sie enthalten sind, verwiesen wird. Dies dient dazu, die Leistung der DIME-Parser zu verbessern: Diese können die primäre SOAP-Nachricht lesen und dann schnell eine Anlage finden, indem nur die Datensatzheader analysiert werden, bis der gewünschte Datensatz gefunden wird. In dieser ersten Version von WSE bezieht Microsoft jedoch eine eher unabhängige Stellung in Bezug auf Anlagen, was bedeutet, dass die WSE-Laufzeit jede Anlage lediglich in der Reihenfolge, in der sie empfangen wurde, extrahiert und sie als Objekt im Arbeitsspeicher aufbewahrt, damit nach Bedarf darauf zugegriffen werden kann. Im vorherigen Beispiel habe ich auf die Anlagen durch Angeben eines URI-ID-Werts für jede Anlage in der Auflistung verwiesen und habe dann eine Auflistung dieser URI-Werte im Textteil der Nachricht zurückgegeben.

Keine WSDL-Unterstützung für DIME

Obwohl die Spezifikation WSDL Extension for SOAP in DIME (in Englisch) eine Methode zur Unterstützung von DIME in WSDL (Web Services Description Language) angibt, enthält WSE keine Aktualisierungen für die WSDL-Generierungsfunktionalität in ASP.NET oder für das Tool Wsdl.exe. Das bedeutet, dass Sie zum Veröffentlichen der Tatsache, dass ein Web Service DIME unterstützt, die WSDL-Datei dieser neuen Spezifikation entsprechend manuell bearbeiten und veröffentlichen müssen. Obwohl es völlig korrekt ist, die DIME-Funktionalität in WSDL zu beschreiben, ist eine vollständige Beschreibung nicht wirklich erforderlich, da Sie einfach das SoapContext-Objekt in eingehenden Nachrichten überprüfen können, um festzustellen, ob Anlagen enthalten sind.

Interoperabilität mit SOAP Toolkit 3.0

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 zwei Laufzeiten erstellt und gelesen werden. Das SOAP Toolkit bietet sogar eine vollständigere Implementierung der WS-Attachments-Spezifikation, wobei das Verweisen auf Anlagen von den primären SOAP-Nachrichten aus unterstützt wird. Das SOAP Toolkit 3.0 enthält auch ein aktualisiertes WSDL Generator-Tool (Wsdlgen3.exe), das WSDL-Dateien erstellt, die der vorgeschlagenen Spezifikation WSDL Extension for SOAP in DIME (in Englisch) entsprechen. WSE unterstützt keine derartigen Beschreibungen für DIME-basierte Web Services.

Bei einem derartigen Interoperabilitätsszenario muss darauf geachtet werden, dass die vom SOAP Toolkit bereitgestellte High-Level-API dazu verwendet wird, einen WSE-basierten Web Service mit Anlagen zu nutzen. Da die High-Level-API eine WSDL-Datei dazu verwendet, die notwendigen Verbindungsobjekte zum Marshallen der Kommunikation zwischen dem Client und dem Web Service zu generieren, müssen Sie die WSDL-Datei für den WSE-basierten Web Service manuell ändern und veröffentlichen, um die fehlenden untergeordneten <dime:message>-Elemente zu den <wsdl:input>- und <wsdl:output>-Elementen hinzuzufügen, wie in der WSDL-Erweiterungsspezifikation definiert. Das SOAP Toolkit 3.0 verarbeitet jedoch nur DIME-Nachrichten, die den WS-Attachments-Spezifikationen (in Englisch) entsprechen, weshalb es nicht wie WSE zum Streamen von Daten verwendet werden kann.

Schlussfolgerung

Web Services Enhancements für Microsoft .NET bietet die vollständigste Lösung zum Senden und Empfangen von Anlagen mit SOAP-Nachrichten. Zusätzlich zur DIME-Unterstützung hostet die WSE-Laufzeit auch die Prozessfilterpipeline, mithilfe derer Sie die WSE-unterstützten Header in der primären SOAP-Nachricht der DIME-Nachricht leicht verarbeiten können. WSE unterstützt auch eine Nicht-SOAP-basierte Implementierung von DIME, mithilfe derer Sie DIME zum Streamen von Daten als eine Reihe von DIME-Datensätzen verwenden können.


Anzeigen: