Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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.