Media-Type Aushandlung
Viele Internetprotokolle auf Anwendungsebene basieren auf dem Austausch von Nachrichten in einem einfachen, flexiblen Format, das als Multipurpose Internet Mail Extensions (MIME) bezeichnet wird. Mime wurde zwar als Standard für den Austausch von E-Mail-Nachrichten verwendet, wird aber heute von einer Vielzahl von Anwendungen verwendet, um sich gegenseitig verstandene Datenformate als MIME- oder Medientypen anzugeben. Der Prozess wird als Medientypaushandlung bezeichnet.
Medientypen sind einfache Zeichenfolgen, die einen Typ und Untertyp (z. B. "text/plain" oder "text/HTML") kennzeichnen. Sie werden verwendet, um Daten zu bezeichnen oder eine Anforderung zu qualifizieren. Ein Webbrowser gibt z. B. als Teil einer HTTP-Anforderung für Daten oder anforderung für Informationen an, dass er "image/gif" oder "image/jpeg" Medientypen anfordert, auf die ein Webserver antwortet, indem er den entsprechenden Medientyp zurückgibt, und, wenn der Aufruf eine Anforderung für Daten war, die Daten selbst im angeforderten Format.
Media-type negotiation is often similar to how existing desktop applications negotiate with the system clipboard to determine which data format to paste when a user chooses Edit/Paste or queries for formats when receiving an IDataObject pointer during a drag-and-drop operation. Der geringfügige Unterschied bei der HTTP-Medientypaushandlung besteht darin, dass der Client nicht im Voraus weiß, welche Formate der Server zur Verfügung hat. Daher gibt der Client vorab die unterstützten Medientypen in der Reihenfolge der größtmöglichen Genauigkeit an, und der Server antwortet mit dem besten verfügbaren Format.
URL-Moniker unterstützen die Medienaushandlung als Möglichkeit für Internetclients und Server, Formate zu akzeptieren, die beim Herunterladen von Daten in BindToStorage-Vorgängen verwendet werden sollen. Zur Unterstützung der Medienaushandlung implementiert ein Client die IEnumFORMATETC-Schnittstelle und ruft die RegisterFormatEnumerator-Funktion auf, um sie beim Bindungskontext zu registrieren. Der Formatenumerator listet die Formate auf, die der Client akzeptieren kann. Ein URL-Moniker übersetzt diese Formate bei der Bindung an HTTP-URLs in Medientypen.
Die vom Client angeforderten möglichen Medientypen werden in URL-Monikern durch FORMATETC-Strukturen dargestellt, die über den IEnumFORMATETC-Enumerator verfügbar sind, der vom Aufrufer im Bindungskontext registriert wurde: Jeder FORMATETC gibt ein Zwischenablageformat an, das den Medientyp identifiziert. Das folgende Codefragment gibt beispielsweise an, dass der Medientyp PostScript ist.
FORMATETC fmtetc;
fmtetc.cfFormat = RegisterClipboardFormat(CF_MIME_POSTSCRIPT);
. . .
Ein Client kann das Format der Zwischenablage auf den speziellen Medientyp CF _ NULL festlegen, um anzugeben, dass der Standardmedientyp der Ressource, auf die von der URL verwiesen wird, abgerufen werden soll. Dieses Format ist in der Regel das letzte Format, an dem der Client interessiert ist. Wenn kein Enumerator beim Bindungskontext registriert ist, funktioniert ein URL-Moniker so, als wäre ein Enumerator verfügbar, der einen einzelnen FORMATETC mit cfFormat=CF _ NULL enthält, und lädt automatisch den Standardmedientyp herunter.
Unabhängig davon, welcher Medientyp verwendet werden soll, wird der Client über das pformatetc-Argument in seiner IBindStatusCallback::OnDataAvailable-Methode über die Auswahl benachrichtigt. Der Rückruf erfolgt im Kontext des Aufrufs des Clients an BindToStorage.
Hinweis
Wenn empfangene Inhalte einen unbekannten Medientyp aufweisen, ruft der Client automatisch RegisterMediaTypes auf, um den neuen Typ zu registrieren.