媒体类型协商

许多应用程序层 Internet 协议基于以简单的灵活格式交换消息,称为多用途 Internet 邮件扩展 (MIME)。 尽管 MIME 最初是交换电子邮件的标准,但如今,各种应用程序都使用它将相互理解的数据格式指定为 MIME 或媒体类型。 此过程称为媒体类型协商

媒体类型是表示类型和子类型的简单字符串(如“text/plain”或“text/HTML”)。 它们用于标记数据或限定请求。 例如,作为 HTTP 请求数据请求或请求信息一部分的 Web 浏览器,指定它正在请求“image/gif”或“image/jpeg”媒体类型,Web 服务器通过返回相应的媒体类型来响应该类型,如果调用是请求数据,则数据本身采用请求的格式。

媒体类型协商通常类似于现有桌面应用程序如何与系统剪贴板协商,以确定当用户在拖放操作期间收到 IDataObject 指针时,选择“编辑/粘贴”或查询格式时要粘贴的数据格式。 HTTP 媒体类型协商的细微差别在于,客户端不知道服务器可用的格式。 因此,客户端按最大保真度顺序预先指定支持的媒体类型,并且服务器以最佳可用格式做出响应。

URL 名字对象支持媒体类型协商,作为 Internet 客户端和服务器同意在 BindToStorage 操作中下载数据时使用的格式。 为了支持媒体类型协商,客户端实现 IEnumFORMATETC 接口并调用 RegisterFormatEnumerator 函数,以将其注册到绑定上下文。 格式枚举器列出了客户端可以接受的格式。 绑定到 HTTP URL 时,URL 名字对象将这些格式转换为媒体类型。

客户端可能请求的媒体类型通过调用方在绑定上下文注册的 IEnumFORMATETC 枚举器提供的 FORMATETC 结构呈现给 URL 名字对象:每个 FORMATETC 都指定标识媒体类型的剪贴板格式。 例如,以下代码片段指定媒体类型为 PostScript。

FORMATETC fmtetc;
fmtetc.cfFormat = RegisterClipboardFormat(CF_MIME_POSTSCRIPT);
. . .

客户端可以将剪贴板格式设置为特殊媒体类型 CF_NULL 以指示应检索的 URL 指向的资源的默认媒体类型。 此格式通常是客户端感兴趣的最后一种格式。 当未向绑定上下文注册任何枚举器时,URL 名字对象就像包含具有 cfFormat=CF_NULL 的单个 FORMATETC 的枚举器一样使用,自动下载默认媒体类型。

无论使用何种媒体类型,客户端都会通过其 IBindStatusCallback::OnDataAvailable 方法上的 pformatetc 参数通知选择。 回调发生在客户端调用 BindToStorage 的上下文中。

注意

如果收到的内容为无法识别的媒体类型,客户端会自动调用 RegisterMediaTypes 以注册新类型。

 

URL 名字对象