IWMSCacheProxy.QueryCache (C#)

The QueryCache method is called by the server to direct the cache plug-in to search the cache for specific content.

void IWMSCacheProxy.QueryCache(
  string bstrOriginUrl,
  IWMSContext pUserContext,
  IWMSCommandContext pCommandContext,
  IWMSContext pPresentationContext,
  int lQueryType,
  IWMSCacheProxyCallback pCallback,
  object varContext
);

Arguments

[in] string containing the origin URL.

[in] IWMSContextIWMSContext Object (C#) containing the User Context.

[in] IWMSCommandContextIWMSCommandContext Object (C#) containing the Command Context.

[in] IWMSContext object containing the Presentation Context.

[in] Member of the WMS_CACHE_QUERY_TYPE_FLAGS enumeration type that indicates why the server called IWMSCacheProxy.QueryCache. This must be one of the following values.

Value

Description

WMS_CACHE_QUERY_OPEN

A client using a downstream proxy requested content.

WMS_CACHE_QUERY_GET_CONTENT_INFO

A downstream proxy requested information about content cached on the remote computer.

WMS_CACHE_QUERY_CACHE_EVENT

A cache event notice is being sent upstream. If the WMS_CACHE_QUERY_LOCAL_EVENT flag is set, the cache event was generated by the local computer. Otherwise, it was sent by a downstream proxy server.

WMS_CACHE_QUERY_REVERSE_PROXY

A downstream server is configured to be a reverse proxy server. If a cache proxy plug-in supports reverse proxy, it can use this flag to determine whether it must map client requests to an upstream server farm.

WMS_CACHE_QUERY_LOCAL_EVENT

The local server is generating an event to send upstream.

[in] IWMSCacheProxyCallbackIWMSCacheProxyCallback Object (C#) containing the callback function. The cache plug-in calls IWMSCacheProxyCallback.OnQueryCache to respond to a call to QueryCache.

[in] object containing a value defined by the server to identify which call to QueryCache the plug-in is responding to when it calls IWMSCacheProxyCallback.OnQueryCache. You must pass this value back unaltered.

Return Value

This method does not return a value. To report an error, the plug-in can throw a COMException object to the server. If the plug-in uses the IWMSEventLogIWMSEventLog Object (C#) to log error information, it is recommended that it throw NS_E_PLUGIN_ERROR_REPORTED (0xC00D157D). Typically, the server attempts to make plug-in error information available to the server object model, the Windows Event Viewer, and the troubleshooting list in the details pane of the Windows Media Services MMC. However, if the plug-in uses the IWMSEventLog object to send custom error information to the Windows Event Viewer, throwing NS_E_PLUGIN_ERROR_REPORTED stops the server from also logging to the event viewer. For more information about plug-in error information, see Identifying Plug-in Errors.

Example

using Microsoft.WindowsMediaServices.Interop;
using System.Runtime.InteropServices;

void IWMSCacheProxy.QueryCache(string bstrOriginUrl , 
            IWMSContext pUserContext , 
            IWMSCommandContext pCommandContext , 
            IWMSContext pPresentationContext , 
            int lQueryType , 
            IWMSCacheProxyCallback pCallback , 
            object varContext )
{
  try
  {
    int nFlag = (int)WMS_CACHE_QUERY_TYPE_FLAGS.WMS_CACHE_QUERY_OPEN;
    int nOpen = lQueryType & nFlag;
    int nGCI = lQueryType & ((int)WMS_CACHE_QUERY_TYPE_FLAGS.WMS_CACHE_QUERY_GET_CONTENT_INFO);
    int nReverseProxy = lQueryType & ((int)WMS_CACHE_QUERY_TYPE_FLAGS.WMS_CACHE_QUERY_REVERSE_PROXY);
            
    // Either a get content information (GCI) or an open call is made.
    if((nOpen!=0)||(nGCI!=0)) 
    {
      // Allocate a content information context.
      IWMSContext Context;
      WMS_CACHE_QUERY_RESPONSE Response = WMS_CACHE_QUERY_RESPONSE.WMS_CACHE_QUERY_MISS;

      // The ContentInfo object is user-defined. It contains
      // information about an item of cached content.
      ContentInfo ci;
      GetContentInfo(bstrOriginUrl,out ci);
      ci.CacheProxyCallback = pCallback;
      ci.varContext = varContext;

      // Retrieve the new content information context.
      GetContentInfoContext(ci,out Context);

      bool bQueryCache = true;
      bool bOnDemand = true;

      // This is not a reverse proxy, and content has been cached.
      if((ci.CacheUrl!=null) && (nReverseProxy==0))
      {
        // Convert the current time to UTC time.
        DateTime now = DateTime.Now;
        now = now.ToUniversalTime();

        // If the content has not expired, declare a cache hit.
        if(ci.ExpirationTime > now)
        {
          // The content is a broadcast. Declare a cache
          // hit and set the cache policy to play the broadcast.
          if((ci.ContentType & 1 )!=0)
          {
            Response = WMS_CACHE_QUERY_RESPONSE.WMS_CACHE_QUERY_HIT_PLAY_BROADCAST;
            bOnDemand = false;
          }
          // The content is on demand. Declare a cache
          // hit and set the cache policy to play the content on demand.
          else
          {
            Response = WMS_CACHE_QUERY_RESPONSE.WMS_CACHE_QUERY_HIT_PLAY_ON_DEMAND;
            bOnDemand = true;
          }
        }

        // The content has expired. 
        else
        {
          if(nOpen!=0)
          {
            bQueryCache = false;
          }
        }
      }

      // The content has not expired. Call OnQueryCache() and send the
      // Response parameter and the content information context
      // back to the server. 
      if(bQueryCache)
      {
        // Retrieve the cache URL from the user-defined content
        // information object.
        string CacheUrl = ci.CacheUrl;
        if(bOnDemand)
        {
          CacheUrl = string.Format("file://{0}",ci.CacheUrl);
        }
        pCallback.OnQueryCache( 0,
                            Response,
                            CacheUrl,
                            Context,
                            null,
                            varContext);
      }

      // The content has expired. Call CompareContentInformation (for
      // open requests only).
      else
      {
        CacheProxyServer.CompareContentInformation(bstrOriginUrl,
                                                 Context,
                                                 pPresentationContext,
                                                 this,
                                                 null,
                                                 this,
                                                 (object)ci);
      }

    }

    // The request is not a GCI or open call. Determine what the
    // request is. 
    else
    {
      // Determine whether the call is for event propagation.
      int nCacheEvent = lQueryType & ((int)WMS_CACHE_QUERY_TYPE_FLAGS.WMS_CACHE_QUERY_CACHE_EVENT);
      int nLocalEvent = lQueryType & ((int)WMS_CACHE_QUERY_TYPE_FLAGS.WMS_CACHE_QUERY_LOCAL_EVENT);
      if((nCacheEvent | nLocalEvent)!=0)
      {
        // Declare a cache miss and ask the server to
        // forward the request.
        WMS_CACHE_QUERY_RESPONSE Response = WMS_CACHE_QUERY_RESPONSE.WMS_CACHE_QUERY_MISS;
        pCallback.OnQueryCache( 0,
                              Response,
                              bstrOriginUrl,
                              null,
                              null,
                              varContext);
      }
    }
  }

  catch(Exception e)
  {
    throw new COMException();
  }

  return;
}

Requirements

Reference: Add a reference to Microsoft.WindowsMediaServices.

Namespace: Microsoft.WindowsMediaServices.Interop.

Assembly: Microsoft.WindowsMediaServices.dll.

Library: WMSServerTypeLib.dll.

Platform: Windows Server 2003, Enterprise Edition; Windows Server 2003, Datacenter Edition; Windows Server 2008.

See Also

Concepts

IWMSCacheProxy Object (C#)