Objet Response |
Tout comme l'objet Request permet de récupérer et de manipuler des informations envoyées par le navigateur client dans sa demande HTTP, l'objet Response vous offre un degré élevé de contrôle de la réponse HTTP transmise au client. Ce contrôle est fourni à plusieurs niveaux qui tombent dans les catégories générales suivantes : Contrôle des données et des types de données qui sont envoyés au client dans les en-têtes de la réponse HTTP Contrôle des données et des types de données qui sont envoyés au client dans le corps de la réponse HTTP Contrôle du moment où les données sont envoyées et de la manière dont elles le sont Le contrôle des en-têtes de réponse HTTP comprend la définition de cookies sur l'ordinateur client, la définition de diverses valeurs d'en-tête HTTP préexistantes (comme le type de contenu et les informations d'expiration pour une page donnée), et enfin l'ajout de vos en-têtes personnalisés à la réponse HTTP. Le contrôle du corps de la réponse HTTP s'effectue directement par le biais des méthodes Write et BinaryWrite. Comme leur nom le laisse supposer, ces méthodes de l'objet Response permettent d'écrire directement des informations dans le corps de la réponse. Elles seront reçues par le client comme toute autre information reçue dans une réponse de demande HTML. Enfin, l'objet Response permet de déterminer quand et comment la réponse est envoyée au client. Par exemple, en utilisant les propriétés et les méthodes impliquées dans la mise en mémoire tampon de la réponse, vous pouvez déterminer si la réponse HTTP doit être envoyée au client en une fois, ou si les résultats de la demande doivent être envoyés un à un. Vous pouvez déterminer, de manière dynamique, si le client est toujours connecté à votre site Web. Vous pouvez rediriger sa demande comme s'il avait demandé autre chose. Enfin, vous pouvez utiliser l'objet Response pour écrire des entrées dans le journal du serveur Web.

Buffer |
Response.Buffer[=blnSetting]
La propriété Buffer détermine si le contenu créé par votre script est remis au navigateur client en une fois ou s'il lui est envoyé immédiatement, à mesure que chaque ligne est créée et entrée dans le flux HTML. Si elle est réglée sur True, tous les scripts de la page sont exécutés avant que les résultats de ce script soient envoyés au navigateur client. La valeur par défaut de la propriété Buffer est False, sauf si vous définissez ASPBufferingOn dans la métabase (via un script Windows Scripting Host ou la console Microsoft Management Console pour votre site Web). Si la valeur est définie dans la métabase, elle peut être remplacée au moyen de la propriété Buffer sur une page. Par exemple, si vous fixez ASPBufferingOn à True, vous pouvez utiliser plus tard la propriété Buffer pour remplacer ce comportement et forcer IIS à ne pas mettre la page en mémoire tampon.
Paramètres
blnSetting Détermine si la réponse HTTP provenant du traitement de votre script par le serveur Web est mise en mémoire tampon puis envoyée au client, ou envoyée au client à mesure qu'elle est créée : True Force le serveur Web à placer tous les résultats de votre script en mémoire tampon jusqu'à ce que le traitement soit terminé où que la méthode Flush ou End de l'objet Réponse soit appelée. Notez que même si la mise en mémoire tampon est réglée sur True, si vous appelez la méthode End, le contenu du tampon est envoyé au client, et les résultats ultérieurs du traitement de votre script ne sont pas envoyés au client. False Force le serveur Web à envoyer les informations au client à mesure que votre script est traité, au lieu d'attendre la fin du traitement. Notez que si la propriété Buffer est fixée à False, tout appel des méthodes Clear, End ou Flush de l'objet Response produira une erreur d'exécution.
Exemple
Prenons l'exemple suivant. Notez que nous n'avons pas défini la propriété Buffer de l'objet Response de manière explicite, suite à quoi elle possède la valeur False :
    <%@ LANGUAGE="VBScript" %>
    <HTML>

    <%
    CODE THAT RETRIEVES A FIELD VALUE FROM A DATABASE
    %>
La réponse n'est pas mise en mémoire tampon avant d'être envoyée au navigateur à l'origine de la demande. Dès lors, si l'action de base de données précédente produit une erreur, l'utilisateur verra une demi-page qui se termine par un message d'erreur. Examinons à présent le second exemple de code :
    <%@ LANGUAGE="VBScript" %>
    <%Response.Buffer = True %>
    <HTML>

    <%
    On Error Resume Next
    ' CODE THAT RETRIEVES A FIELD VALUE FROM A DATABASE
    If Err.Number <> 0 Then
       Response.Clear
       Response.Write "There has been an error. Here is the SQL"
       Response.Write "statement that caused the problem: "
       Response.Write strSQL
       Response.End
    End If
    %>
Dans cet exemple, la réponse est tout d'abord placée en mémoire tampon puis est terminée avant d'être envoyée au navigateur à l'origine de la demande. Il est ainsi possible d'effacer la mémoire tampon et d'y placer un simple message d'erreur, qui fournit plus d'information que l'exemple sans mise en mémoire tampon présenté précédemment. Même si le code fourni ici ne permet pas une interaction considérable, il est suffisant comme exemple. Si la réponse n'est pas placée en mémoire tampon, le client recevra la réponse HTTP à sa demande à mesure qu'elle est créée, même si cette création produit des erreurs.
Remarques
Il ne faut pas oublier que la propriété Buffer doit être définie avant que la balise <HTML> soit générée pour la réponse HTTP. Toute tentative de définition de la propriété Buffer après la balise <HTML> produira une erreur d'exécution. Si votre script comprend une directive de prétraitement qui définit par exemple la langue de la page, celle-ci doit être placée avant la définition de la valeur de la propriété Buffer. Si vous tentez de définir la langue e la page après avoir fixé la valeur de la propriété Buffer, vous rencontrerez une erreur. Si l a propriété Buffer est fixée à True alors que votre script n'appelle pas la méthodeFlush où que ce soit, le serveur Web répondra aux demandes Keep-Alive envoyées par le client. Les demandes Keep-Alive émanant du navigateur indiquent au serveur qu'il doit maintenir une connexion avec le client. Si la demande Keep-Alive du client est acceptée par le serveur, il n'est pas contraint de rétablir la connexion à chaque fois qu'il effectue une demande HTTP. Il est en fait déjà connecté. Le client est ainsi dispensé de devoir à nouveau résoudre l'URL. Si la propriété Buffer est fixée à False ou si vous utilisez la méthode Flush dans votre script, le serveur sera forcé de créer une nouvelle connexion au client en réponse à chaque demande. Quand est-il conseillé d'activer la mise en mémoire tampon pour un script ? La réponse dépend de deux facteurs : la durée à partir de laquelle un délai d'attente est considéré comme excessif par vos clients, et la complexité de vos scripts. Si vos clients débutent sur Internet, leur patience est généralement assez limitée ; ces clients attendent une réaction immédiate lorsqu'ils cliquent sur le bouton Envoyer de vos formulaires. Les utilisateurs plus aguerris comprennent mieux les tenants et aboutissants des applications Internet et peuvent se montrer plus compréhensifs vis-à-vis des délais d'attente de résultats de scripts. Le facteur le plus important réside dans l'importance que vous attachez à la fourniture de la réponse en une fois. Pour les scripts qui réalisent un traitement itératif considérable, où chaque boucle est directement affectée par la boucle précédente, il peut être important de présenter le résultat final sous la forme d'une seule unité. Par contre, si votre script consiste en plusieurs sections définissables dont chacune peut aisément être affichée seule, la mise en mémoire tampon peut être moins importante. Une stratégie permettant de prendre en compte les délais des scripts complexes dont les résultats sont attendus dans une unité consiste à fournir une page de type "veuillez patienter". Cette page intermédiaire avertit l'utilisateur que sa demande a été reçue et que le script est en cours de traitement. Par exemple, supposons que le navigateur client demande un script ASP qui extrait et met en forme des données à partir d'une requête très complexe qui exige un long temps de chargement (par exemple 30 secondes). Au lieu de contraindre le client à cliquer sur un lien, après quoi rien ne se passe pendant 30 secondes (ce qui peut amener un utilisateur inexpérimenté à cliquer à plusieurs reprises sur le même lien ou bouton), vous pourriez afficher une page semblable à la suivante :
    <HTML>
    <HEAD><TITLE>Please Wait</TITLE></HEAD>
    <BODY LANGUAGE = "VBScript" OnLoad = "WinLoad( )">
    Your request is being processed, please wait...
    <SCRIPT LANGUAGE = "VBScript">
    Sub WinLoad( )
       Parent.Location.HREF = "/Reports/Longreport.asp"
    End Sub
    </SCRIPT>
    </BODY>
    </HTML>
La petite page sera chargée très rapidement, présentant à l'utilisateur un message "veuillez patienter" jusqu'à ce que le script suivant ait été traité et que le rapport soit prêt à être visualisé. À ce moment-là, la page "veuillez patienter" est déchargée et le rapport est chargé. Enfin, s'il s'avère que la plupart de vos scripts exigent une mise en mémoire tampon, il peut être utile de fixer la métabase à ASPBufferingOn (en employant la page Configuration des options de l'application pour votre répertoire virtuel ; voir Annexe D ) de manière à ce que tous les scripts soient mis par défaut en mémoire tampon.

CacheControl |
Response.CacheControl[=ProxyCacheControlSetting]
La propriété CacheControl permet de déterminer si les serveurs proxy qui servent vos pages peuvent les placer en mémoire cache. Si votre page contient une grande quantité d'informations et ne change pas souvent, il peut être utile d'autoriser les serveurs proxy à la placer en mémoire cache, ce qui accélère sa fourniture aux navigateurs clients qui en font la demande.
Paramètres
ProxyCacheControlSetting Détermine si les serveurs proxy utilisés pour accéder à votre site Web peuvent placer vos pages en mémoire cache. Par défaut, cette propriété est fixée à Private, ce qui signifient que les serveurs proxy ne peuvent pas placer votre page en mémoire cache. Toutefois, si cette valeur est Public, les serveurs proxy peuvent le faire. Notez que Private et Public sont des valeurs de chaîne.
Exemple
La définition de cette propriété est une opération simple, comme le montre le code suivant. Vous vous demandez peut-être s'il existe une manière de déterminer si le client accède à la page Web via un serveur proxy. Bien qu'il en existe une, si vous êtes informé à l'avance de l'éventuelle existence de serveurs proxy, l'opération est problématique et complexe. En outre, il n'est pas nécessaire de le déterminer avant de définir cette propriété. Si la demande du client est traitée par un serveur proxy, cette propriété influera sur la mise en cache de la page ; si elle ne l'est pas, la propriété sera totalement ignorée.
    <%

    ' The following code sets the HTTP cache control header so
    ' that this page can be cached by the proxy servers being
    ' used to access the page.
    Response.CacheControl = "Public"
    %>
    <HTML>
    <%
    ' Note that the CacheControl property was set BEFORE the
    ' <HTML> tag was constructed.
    %>
Remarques
Il est clair que, si le serveur proxy peut placer votre page en mémoire cache, les temps d'accès des clients qui accèdent à la page via un serveur proxy seront réduits. Toutefois, cette mise en cache est moins utile si la page est fréquemment modifiée. Notez en outre que, même si vous fixez la valeur de la propriété CacheControl à Public, le serveur proxy n'est pas obligé de placer vos pages en mémoire cache. Pour pouvoir le faire, le serveur proxy doit être configuré de manière appropriée. La définition d'une valeur pour CacheControl modifie la valeur de l'en-tête HTTP de contrôle de cache envoyé au client lorsqu'il fait une demande. Si vous utilisez cette propriété, vous devez le faire avant d'envoyer une réponse au client (c.-à-d. avant que la balise <HTML> soit générée pour votre page). Si vous tentez de définir la valeur de cette propriété (ou de tout autre en-tête HTTP) alors que la balise <HTML> a déjà été envoyée au client, une erreur se produira, sauf si la réponse est placée en mémoire tampon. N'oubliez pas que la définition de cette propriété ne garantit pas la mise en mémoire cache sur le serveur proxy. Le serveur proxy doit lui-même être configuré de manière à placer ces pages en mémoire cache pour que cette propriété ait le moindre effet.

Charset |
Response.Charset(strCharsetName)
La propriété Charset permet de définir un jeu de caractères pour le contenu de la réponse HTTP. Le nom de ce jeu de caractères est ajouté à la fin de la paire en-tête/valeur Content-Type dans les en-têtes de réponse HTTP.
Paramètres
strCharsetName strCharsetName est une chaîne qui correspond à un jeu de caractères. Le jeu de caractères par défaut est ISO-LATIN-1.
Exemple
Si vous ne définissez pas la propriété Charset, l'en-tête de réponse HTTP Content-Type se présente comme suit :
    content-type:text/html
Si vous définissez la propriété Charset, comme dans la ligne de code suivante :
    <%
    Response.Charset("ISO-LATIN-7")
    %>
la valeur utilisée pour fixer la valeur de la propriété Charset (la chaîne "ISO-LATIN-7" dans le code ci-dessus) est ajoutée à la fin de la valeur d'en-tête de réponse HTTP Content-Type :
    content-type:text/html;charset=ISO-LATIN-7
Remarques
Bien que le présent document et la documentation Microsoft définissent Charset comme une propriété, il s'agit en réalité d'une méthode qui emploie un argument de chaîne représentant le nom du jeu de caractères à ajouter à la fin de l'en-tête de réponse HTTP Content-Type. Dès lors, si vous tentez de définir la valeur de la "propriété" Charset comme vous le feriez pour n'importe quelle autre propriété de l'objet Response, vous recevrez un message d'erreur :
    <%
    ' Next line will NOT work:
    Response.Charset = "ISO-LATIN-7"
    %>
Si la valeur que vous définissez pour la propriété Charset ne représente pas un jeu de caractères valide, elle est ignorée par le navigateur du client et le jeu de caractères par défaut est utilisé. Notez que vous pouvez uniquement ajouter le nom d'un jeu de caractères à la fin de la paire en-tête/valeur Content-Type. Toute modification ultérieure de la valeur de la propriété Charset remplace simplement la valeur définie précédemment. Par exemple, le code suivant :
    <%
    Response.Charset("ISO-LATIN-7")
    Response.Charset("ISO-LATIN-3")
    %>
produit la paire en-tête/valeur de réponse HTTP Content-Type suivante :
    content-type:text/html;charset=ISO-LATIN-3
Notez également que si votre type de contenu est exclusivement non texte (par exemple des données d'image), la valeur du jeu de caractères est ignorée par le navigateur. Enfin, le jeu de caractères par défaut pour les ordinateurs Apple Macintosh et compatibles n'est pas ISO-LATIN-1, au contraire des PC IBM et compatibles. Si vous ne définissez pas la propriété Charset, tous les navigateurs Macintosh interpréteront les pages demandées comme employant le jeu de caractères Macintosh. Le système Personal Web Server de Microsoft pour Macintosh convertit automatiquement le jeu de caractères du contenu demandé en ISO-LATIN-1 et ignore tout autre réglage de la propriété Charset que vous fournissez dans votre script. Comme les autres propriétés qui provoquent un changement des valeurs de l'en-tête de réponse HTTP, la propriété Charset doit être définie avant que le serveur n'envoie la balise <HTML> au client, sauf si la réponse est placée en mémoire tampon.

ContentType |
Response.ContentType[=strContentType]
La propriété ContentType permet de définir la valeur du réglage Content-Type dans l'en-tête de réponse HTTP. Cette valeur définit le type de données envoyées dans le corps de la réponse. Le navigateur client utilise ces informations pour déterminer la manière d'interpréter le contenu d'une réponse HTTP téléchargée.
Paramètres
strContentType Représente le type de contenu. Cette chaîne possède un format type/sous-type. La portion de type de la valeur représente la catégorie de contenu générale, et la portion de sous-type représente le type de contenu spécifique.
Exemple
    <%

    ' The following code sets the value of the Content-Type
    ' HTTP response header according to the value of a
    ' local variable.
    If strData = "jpg" Then
       Response.ContentType = "image/JPEG"
    Else
       Response.ContentType = "text/plain"
    End If

    %>
Remarques
Le tableau 8.1 présente quelques-unes des valeurs possibles des paires type/sous-type ContentType.

Valeur d'en-tête HTTP Content-Type disponibles

Type | Sous-type | Description
Text | Plain, RichText | Informations textuelles
Multipart | Mixed, Alternative, Parallel, Digest | Les données dans la réponse consistent en plusieurs parties de données indépendantes.
Message | Partial, External-body | Message encapsulé
Image | JPEG, GIF | Données d'image
Audio | Basic | Données audio
Video | MPEG | Données vidéo
Application | ODA, PostScript, Active | Données binaires généralement non interprétées, ou données à traiter par une application basée sur la messagerie.
Le nombre de sous-types devrait augmenter considérablement au fil du temps. La meilleure référence des sous-types disponibles est la version la plus récente de la RFC MIME (RFC 2231 à l'heure actuelle). Le secteur devrait donner naissance à de nombreux nouveaux sous-types. Par exemple, Microsoft a déjà ajouté le sous-type x-cdf au type application pour son format de définition de canal. Comme les autres propriétés qui provoquent un changement des valeurs de l'en-tête de réponse HTTP, la propriété ContentType doit être définie avant que le serveur n'envoie la balise <HTML> au client, sauf si la réponse est placée en mémoire tampon. Vous trouverez un autre exemple de propriété ContentType dans l'exemple de code de la méthode BinaryWrite de l'objet Response, plus loin dans ce chapitre.

Expires |
Response.Expires[=intNumMinutes]
La propriété Expires détermine le délai (en minutes) pendant lequel l'ordinateur client stocke la page actuelle en mémoire cache. Si l'utilisateur revient à cette page dans le délai défini pour la propriété Expires, il visualisera la version stockée en mémoire cache. Si la propriété Expires n'est pas définie, le délai d'expiration du contenu défini pour le répertoire virtuel (via la page Propriétés du répertoire virtuel dans la console Microsoft Management Console) est employé. Sa valeur par défaut est fixée à 24 heures.
Paramètres
intNumMinutes Le nombre de minutes pendant lequel le navigateur du client doit stocker la page actuelle en mémoire cache.
Remarques
Si vous voulez empêcher le navigateur du client de stocker la page en mémoire cache, utilisez une valeur de pour intNumMinutes. Ce faisant, vous forcerez le client à redemander la page au serveur Web à chaque fois qu'il y accède. Si vous tentez d'utiliser la propriété Expires à plusieurs reprises dans un script, c'est la valeur la plus courte qui sera utilisée. Par exemple, la page contenant le script suivant sera mise en mémoire cache pendant 5 minutes, en dépit du fait que la dernière valeur de la propriété Expires est fixée à 20 minutes :
    <%

    Response.Expires = 10
    Response.Expires = 5
    Response.Expires = 20

    %>
Comme les autres propriétés qui provoquent un changement des valeurs de l'en-tête de réponse HTTP, la propriété Expires doit être définie avant que le serveur n'envoie la balise <HTML> au client, sauf si la réponse est placée en mémoire tampon.

ExpiresAbsolute |
Response.ExpiresAbsolute[=[ Date ] [ Time ] ]
Définit la date et l'heure auxquelles le contenu de la page actuelle cessera d'être stocké en cache sur l'ordinateur client. Si aucune heure n'est spécifiée lors de la définition de la propriété ExpiresAbsolute, elle est fixée à minuit à la date indiquée. Avant la date spécifiée dans la propriété ExpiresAbsolute, le client affichera la version stockée en mémoire cache de la page actuelle si l'utilisateur y accède.
Paramètres
Date Une date civile après laquelle la page actuelle ne sera plus stockée en cache. La valeur de date à employer doit être au format standard mois/jour/année. Toutefois, la valeur envoyée dans l'en-tête Response sera conforme au format de date de la RFC 1123. Time Spécifie l'heure précise du jour défini dans Date après laquelle la page actuelle ne sera plus stockée en mémoire cache sur l'ordinateur de l'utilisateur. Si aucune date n'est spécifiée, le navigateur client fera expirer la page à minuit du jours en cours. Le serveur Web convertit l'heure que vous utilisez en heure GMT avant d'envoyer cet en-tête au client.
Exemple
    <%
    ' The following code sets the current page's caching on the
    ' client machine to end at 9 P.M. on 7 May 1998 GMT. NOTE
    ' the use of the "#" to designate the date and time.
    Response.ExpiresAbsolute=#May 7, 1998 21:00:00#
    %>
Remarques
Comme le montre cet exemple, vous devez utiliser le caractère dièse (#) afin de désigner la date et l'heure utilisées dans la valeur de la propriété ExpiresAbsolute. Tout comme pour la propriété Expires, si vous définissez cette propriété à plusieurs reprises, la mise en cache de la page actuelle se terminera à la date et l'heure les plus précoces définies dans le script. Comme les autres propriétés qui provoquent un changement des valeurs de l'en-tête de réponse HTTP, la propriété ExpiresAbsolute doit être définie avant que le serveur n'envoie la balise <HTML> au client, sauf si la réponse est placée en mémoire tampon.

IsClientConnected |
Response.IsClientConnected
Propriété qui renvoie True si le client est toujours connecté au serveur Web depuis la dernière utilisation de la méthode Write de l'objet Response et renvoie False dans le cas contraire.
Paramètres
None
Exemple
    <%
    ' The following code determines whether the client
    ' is still connected to the server. If it is still
    ' connected, then the SessionID (see Chapter 10) will be
    ' used to retrieve the user information from a database.
    If Response.IsClientConnected Then
       strUserName = fn_strGetUserName(Session.SessionId)
    End If
    %>
Remarques
La propriété IsClientConnected permet de déterminer si le client s'est déconnecté. Cette aptitude est très importante si le script actuel est long. Si le client n'est plus connecté, il peut être important d'arrêter le traitement d'un script. L'exemple suivant montre comment vérifier si le client est toujours connecté avant de poursuivre l'exécution d'un long script. Si le client n'est plus connecté, la manière la plus aisée d'arrêter tous les traitements consiste à utiliser la méthode End de l'objet Response.
    <%Response.Buffer = True%>
    <HTML>
    <HEAD><TITLE>One Long Script</TITLE></HEAD>
    <BODY>
    <%

    ' The following code is the first of two segments
    ' in this script that will take a long time to process:
    [SOME LONG CODE]

    ' Now before performing the second half of this long script,
    ' check to see if the client is still connected.
    If Response.IsClientConnected Then
       [SECOND LONG CODE SEGMENT]
    Else
       ' The client is no longer connected, end the script's
       ' processing.
       Response.End
    End If
    %>
    </BODY></HTML>
Cette propriété n'est utile que pour les clients qui emploient HTTP 1.1. Si le navigateur utilise HTTP 1.0, IIS assure le suivi de la session à l'aide de demandes HTTP individuelles et de demandes Keep-Alive de la part du client, et non au moyen d'une connexion constante qui n'est conforme qu'à la version ultérieure (1.1+) de HTTP. Si le fichier ASP dans lequel vous utilisez IsClientConnected tourne sous IIS 4.0, la valeur de la propriété n'est précise que si le fichier envoie du contenu au client (en d'autres termes, s'il s'agit d'un fichier qui ne contient que du code côté serveur, la valeur de IsClientConnected qui en résulte n'est pas correcte). Toutefois, dans IIS 5.0, IsClientConnected fonctionne toujours, que le fichier actuel envoie ou non du contenu au client.

PICS |
Response.PICS(strPICSLabel)
Ajoute un libellé PICS (Platform for Internet Content Selection) à l'en-tête de réponse HTTP. Ce système PICS marque votre contenu Web de manière à permettre aux services de contrôle d'accès (comme RSAC (Recreational Software Advisory Council) et SafeSurf, une association de parents) d'évaluer ce contenu selon divers critères définis par des logiciels de contrôle d'accès tels que NetNanny et CyberWatch.
Paramètres
strPICSLabel Une valeur de chaîne qui contient la totalité du libellé PICS à ajouter. Le libellé PICS comprend les parties suivantes : L'URL du service de contrôle d'accès qui a produit le libellé. L'ensemble de paires attribut/valeur définies par PICS (et extensibles) qui contiennent des informations sur l'évaluation du contenu proprement dite, comme la date à laquelle elle a été attribuée et sa date d'expiration. Un ensemble de paires attribut/valeur créées par le service de contrôle d'accès, qui représente le niveau attribué au contenu. Par exemple, le RSAC utilise quatre attributs pour évaluer les logiciels : violence, teneur sexuelle, gros mots et nudité. Ces quatre attributs et les valeurs correspondantes se présenteraient comme suit : (V 0 S 1 L 3 N 0).
Exemple
    <%
    ' The following piece of code sets a PICS label for the
    ' content of this page corresponding to the rating discussed
    ' earlier.
    Dim strPicsLabel

    strPicsLabel = _
           "(PICS-1.1 <HTTP://www.rsac.org/ratingsv01.html> "
    strPicsLabel = strPicsLabel & "labels on " & Chr(34)
    strPicsLabel = strPicsLabel & "2000.07.20T06:00-0000" & _
                   Chr(34)
    strPicsLabel = strPicsLabel & " until " & Chr(34)
    strPicsLabel = strPicsLabel & "2000.12.31T23:59-0000" & _
                   Chr(34)
    strPicsLabel = strPicsLabel & "ratings (V 0 S 1 L 3 N 0))"

    Response.PICS(strPicsLabel)
    %>
Remarques
Le libellé PICS des exemples signifie que : La version de PICS utilisée est la version 1.1. Le service d'évaluation est RSAC. L'URL du service d'évaluation est http://www.rsac.org/ratingsv01.html. Le libellé du contenu doit entrer en vigueur à 6h00 GMT le 20/7/2000. Le libellé du contenu expire à 23:59 GMT le 31/12/2000. Dans le libellé de contenu, le niveau de violence vaut 0, le niveau de teneur sexuelle vaut 1, celui de gros mots vaut 3 et celui de nudité vaut 0. Le libellé PICS réellement ajouté à l'en-tête de réponse HTTP est le suivant :
    PICS-label:(PICS-1.1 http://www.rsac.org/ratingsv01.html
    labels on "1998.03.20T06:00-0000" until
    "1999.12.31T023:59-0000" ratings (v 0 s 1 l 3 n 0))
Si vous tentez d'ajouter un libellé PICS non valide à l'en-tête HTTP, l'ordinateur client l'ignorera. Notez que chaque valeur définie pour la propriété PICS remplace la valeur précédente. Seule la dernière valeur définie est envoyée à l'ordinateur client. Notez aussi que les dates dans le libellé PICS sont placées entre guillemets. Vous devez dès lors utiliser le caractère Chr(34) (34 est l'équivalent ASCII du guillemet). La méthode la plus simple pour ce faire consiste à taper le libellé tel qu'il doit apparaître dans le libellé PICS final, puis à remplacer chaque guillemet dans la ligne de code par ce qui suit :
    " & Chr(34) & "
Comme les autres propriétés qui provoquent un changement des valeurs de l'en-tête de réponse HTTP, l'ajout d'un libellé PICS doit être effectué avant que le serveur n'envoie la balise <HTML> au client, sauf si la réponse est placée en mémoire tampon.

Status |
Response.Status(strStatusDescSetting)
Définit la ligne d'état HTTP qui est renvoyée à l'ordinateur client à partir du serveur Web.
Paramètres
strStatusDescSetting strStatusDescSetting est une valeur de chaîne qui contient un code d'état à trois chiffres indiquant l'état de la demande HTTP, ainsi qu'une brève explication du code d'état. Les valeurs possibles du paramètre strStatusDescSetting sont décrites dans la version actuelle de la norme HTTP ; elles tombent dans les catégories de niveau supérieur suivantes : La version la plus récente de la norme HTTP est accessible à l'adresse http://www.w3c.org/protocols. 1xx La gamme 100 est réservée à l'envoi d'états de réponse strictement informatifs au client. 2xx La gamme 200 est réservée à l'envoi d'états de réponse de réussite au client. 3xx La gamme 300 est réservée à la redirection du client. Cette gamme d'états doit être utilisée pour les pages demandées qui ont été déplacées de manière temporaire ou permanente. 4xx La gamme 400 est réservée à l'envoi de notices d'erreur client au client. Par exemple, vous avez sans aucun doute déjà rencontré l'état d'erreur 404 Not Found, renvoyé à votre navigateur lorsque vous tentez d'accéder à une page qui a été déplacée ou qui n'existe pas. 5xx La gamme 500 est réservée à l'envoi de notices d'erreur serveur au client. Par exemple, une tentative d'accéder aux pages d'un serveur incapable de traiter la demande en raison d'une surcharge temporaire ou d'activités de maintenance pourrait produire l'état de réponse 503 Service Not Available.
Exemple
    <%
    ' The following code sets the Status property of the
    ' Response object to 404 Not Found. Unless other content is
    ' generated for the page, the status code will be
    ' interpreted by itself by the client.
    strStatusText = _
          "404 Not Found The Web server cannot find the "
    strStatusText = strStatusText & "file or script you asked "
    strStatusText = strStatusText & "for. Please check the URL "
    strStatusText = strStatusText & "to ensure that the path "
    strStatusText = strStatusText & "is correct."
    Response.Status = strStatusText
    %>
Remarques
Tout comme lors de la définition d'autres en-têtes de réponse, chaque nouvelle définition de la valeur de la propriété Status remplace la valeur précédente. Comme les autres propriétés qui provoquent un changement des valeurs de l'en-tête de réponse HTTP, la propriété Status doit être définie avant que le serveur n'envoie la balise <HTML> au client, sauf si la réponse est placée en mémoire tampon.

Cookies |
    strKeyName = Response.Cookies.Key(3)
    strKeyValue = Response.Cookies.Item(strKeyName)
  La collection Cookies de l'objet Response permet à votre application ASP d'utiliser l'en-tête de réponse HTTP Set-Cookie pour écrire des cookies sur l'ordinateur du client. Si vous tenez de définir la valeur d'un cookie qui n'existe pas, ce cookie est créé. S'il existe déjà, la nouvelle valeur que vous définissez remplace l'ancienne valeur déjà stockée sur l'ordinateur client. Tout comme la collection Cookies de l'objet Request, chaque cookie de la collection Cookies de l'objet Response peut aussi représenter un dictionnaire de cookies . Comme vous l'avez vu au chapitre 7, un dictionnaire de cookies est une construction similaire à une table associative, en ce sens que chaque élément de la table peut être identifié par son nom. Pour plus d'informations sur les dictionnaires de cookies, reportez-vous à la section relative à la collection Cookies de l'objet Request dans le chapitre 7. La collection Cookies de l'objet Response, comme les autres collections ASP, possède les propriétés suivantes : Item Renvoie la valeur d'un élément précis de la collection. Pour définir un élément, vous pouvez utiliser un numéro d'index ou une clé. Key Renvoie le nom d'un élément précis de la collection Cookies. Tout comme la valeur de chaque élément est représentée par la propriété Item, le nom de chaque élément est représenté par sa propriété Key. Si vous ignorez le nom d'une clé spécifique, vous pouvez l'obtenir à l'aide de sa référence ordinale. Par exemple, supposons que vous vouliez connaître le nom de clé du troisième élément de la collection, puis la valeur de cet élément. Vous pouvez utiliser le code suivant :
      strKeyName = Response.Cookies.Key(3)
      strKeyValue = Response.Cookies.Item(strKeyName)
  Si, à l'inverse, vous savez que le nom de clé du troisième élément est COLOR_PREF, vous pouvez utiliser le code suivant pour récupérer la valeur de cet élément :
      strKeyValue = Response.Cookies.Item("COLOR_PREF")
Count La propriété Count de la collection Cookies représente le nombre actuel de cookies dans la collection. Tout comme les autres collections ASP, vous pouvez récupérer la valeur de n'importe quel champ de la collection Cookies par l'intermédiaire de la propriété Item. Toutefois, comme expliqué ailleurs dans ce manuel, dans les exemples suivants, la syntaxe a été abrégée de manière à ne pas montrer explicitement l'emploi de la propriété Item. Par exemple :
    Response.Cookies("UserPref") = "Red"
est une forme abrégée de :
    Response.Cookies.Item("UserPref") = "Red"
Pour fixer la valeur d'un cookie, vous devez employer du code semblable au suivant :
    Response.Cookies("LastSearch") = _
       "SELECT * FROM Details WHERE Color = 'Red'"
  Pour plus d'informations sur les propriétés Item, Key et Count d'une collection, reportez-vous à la discussion de la section 4.2 du chapitre 4. Le code précédent crée le cookie UserPref s'il n'existe pas (ou le remplace s'il existe). Ce cookie se traduirait par l'ajout d'un en-tête de réponse SET-COOKIE à la réponse renvoyée au navigateur client. Le navigateur client recevrait cet en-tête de réponse et créerait (ou remplacerait) un cookie UserPref sur l'ordinateur de l'utilisateur. Chaque élément de la collection Cookies (ou de la clé secondaire si ce cookie est un dictionnaire de cookies) possède également les attributs suivants, spécifiques aux cookies : Domain Envoie le cookie de manière à ce que le client n'envoie la valeur du cookie qu'aux pages du domaine défini dans la propriété Domain. La propriété Domain est une propriété en écriture seule. Par exemple, supposons que vous vouliez ajouter le domaine "mycorp.com" au cookie LastSearch suivant. Le client enverrait ainsi la valeur de ce cookie au domaine mycorp.com lorsqu'il demande des pages sur celui-ci :
      Response.Cookies("LastSearch").Domain = "mycorp.com"
  Expires La date à laquelle le cookie expire et est effacé sur l'ordinateur client. Par exemple, supposons que le cookie doive expirer le 29 janvier 2000. Vous utiliserez le code suivant :
      Response.Cookies("LastSearch").Expires = #1/29/2000#
  Si vous ne définissez pas la valeur de la propriété Expires, le cookie reste sur l'ordinateur client pendant toute la durée de la session du client. De même, le cookie ne restera sur l'ordinateur client que pendant la durée de la session du client si la valeur de date fixée pour la propriété Expires est antérieure à la date actuelle. La propriété Expires est une propriété en écriture seule. HasKeys Comme indiqué précédemment, un cookie de la collection Cookies peut aussi représenter un dictionnaire de cookies. Pour déterminer si un cookie précis comporte des clés secondaires, vous devez employer sa propriété HasKeys, comme dans l'exemple suivant :
      blnHasKeys = Response.Cookies("Colors").HasKeys
      If blnHasKeys Then
         strColor3 = Response.Cookies("Colors")("color3")
      End If
  La propriété HasKeys est une propriété en lecture seule. Path La propriété Path représente le répertoire virtuel sur le serveur dans lequel le cookie sera envoyé par le navigateur client lorsque ce dernier demandera une page dans ce chemin d'accès virtuel. Par exemple, si le client ne doit envoyer ce cookie qu'aux scripts du répertoire virtuel /Apps/SearchApps, vous devez utiliser la ligne de code suivante :
      Response.Cookies("LastSearch").Path = "/Apps/SearchApps"
  Si l'attribut Path du cookie n'est pas défini, le chemin d'accès utilise par défaut celui de l'application ASP actuelle. La propriété Path est une propriété en écriture seule. Secure La propriété Secure permet de stipuler si le cookie est uniquement envoyé à partir du client si ce dernier emploie SSL (Secure Sockets Layer). Par exemple, supposons que vous ayez stocké des informations confidentielles dans un cookie (ce n'est pas prudent, mais il peut arriver que cela soit nécessaire) et que vous voulez que le navigateur de l'utilisateur n'envoie ces informations que s'il emploie SSL. Vous réduirez ainsi nettement le risque qu'un cookie confidentiel puisse être intercepté. Vous pouvez pour ce faire utiliser la simple ligne de code suivante :
      Response.Cookies("SensitiveCookie").Secure = True
La propriété Secure emploie une valeur booléenne. La propriété Secure est une propriété en écriture seule.
Exemple
L'exemple ci-dessous explique de manière plus détaillée l'emploi de la collection Cookies de l'objet Response. Il fait la démonstration de nombreux éléments abordés précédemment.
    <HTML>
    <HEAD><TITLE>Search Cookie Example</TITLE></HEAD>
    <BODY>
    <H3>Welcome to the Search Results Options Page.</H3>
    You can use the following form to select your search results display
    options.
    These options will be saved on your machine as a set of cookies.
    <FORM ACTION="/SaveSearchCookie.asp" METHOD = POST>
    First Name:<INPUT TYPE = TEXT NAME = "txtFirstName"><BR>
    Last Name:<INPUT TYPE = TEXT NAME = "txtLastName"><BR>
    User ID:<INPUT TYPE = TEXT NAME = "txtUserId"><BR>
    Check All that Apply:
    Show Descriptions:
    <INPUT TYPE = CHECKBOX NAME = "chkUserPrefs"VALUE = "Desc">
    Show Hit Count (display how many matches found per result):
    <INPUT TYPE = CHECKBOX NAME = "chkUserPrefs"VALUE = "Count">
    Show Relevance with Graph:
    <INPUT TYPE = CHECKBOX NAME = "chkUserPrefs"
    VALUE = "Graph">
    Use Small Fonts(will show more results per page):
    <INPUT TYPE = CHECKBOX NAME = "chkUserPrefs"
    VALUE = "Small">
    <INPUT TYPE = SUBMIT VALUE = "Save Selections">
    </FORM>
    </BODY>
    </HTML>
Le code suivant (SaveSearchCookie.ASP) récupère les valeurs sélectionnées dans la fenêtre précédente et les enregistre sur l'ordinateur de l'utilisateur, sous la forme de cookies :
    <%
    ' The following code retrieves user information from the
    ' Form collection of the Request object (see Chapter 7) and
    ' then writes the information to a set of cookies on the
    ' client machine.
    Dim strFirstName
    Dim strLastName
    Dim strUserId
    Dim intCounter
    Dim intPrefCounter
    Dim strKeyName
    Dim arstrUserPrefs( )

    ' Retrieve user information...
    strFirstName   = Request.Form("txtFirstName")
    strLastName    = Request.Form("txtLastName")
    strUserId      = Request.Form("txtUserId")

    intPrefCounter = 1

    For intCounter = 1 to Request.Form("chkUserPrefs").Count
       ReDim Preserve arstrUserPrefs(intPrefCounter)
       arstrUserPrefs(intPrefCounter - 1) = _
          Request.Form("chkUserPrefs")(intCounter)
       intPrefCounter = intPrefCounter + 1
    Next

    ' Write the user information to the client machine.
    ' Save all the information in cookies, but set the
    ' Expires property only for the UserId. We'll want
    ' that to remain on the client machine after the session
    ' is complete.
    Response.Cookies("UserFirstName") = strFirstName
    Response.Cookies("UserLastName") = strLastName

    For intCounter = 1 to intPrefCounter - 1
       strKeyName = "Pref" & CStr(intCounter)
       Response.Cookies("UserPrefs")(strKeyName) = _
          arstrUserPrefs(intCounter - 1)
    Next

    ' Note in the first line below, that when no property
    ' is specified, the value of the cookie is set.
    Response.Cookies("UserId") = strUserId
    Response.Cookies("UserId").Expires = #December 31, 1999#
    Response.Cookies("UserId").Domain = "www.customsearch.com"
    Response.Cookies("UserId").Path = "/usersearch/"
    Response.Cookies("UserId").Secure = True
    %>
Remarques
Dans l'exemple, le cookie UserFirstName est envoyé à l'ordinateur client. Pour cet exemple, supposons que la valeur de la variable strFirstName soit la chaîne "David." L'en-tête de réponse HTTP envoyé à l'ordinateur client est le suivant :
    Set-Cookie:USERFIRSTNAME=david
En outre, pour cet exemple, supposons que les trois valeurs envoyées soient 800 (largeur du navigateur client), 8 (profondeur binaire de l'affichage en couleurs) et English (choix de l'anglais comme préférence linguistique). L'en-tête de réponse HTTP envoyé au client est le suivant :
    Set-Cookie:USERPREFS=PREF1=800&PREF2=8&PREF3=english
Si la valeur de chaîne envoyée comme valeur d'un cookie contient des espaces, ceux-ci sont remplacés par des symboles plus (+) dans l'en-tête de réponse HTTP. Si vous envoyez une valeur de cookie suivante au cookie UserPrefs sur l'ordinateur client sans définir de SubKey, comme dans l'exemple suivant :
    Response.Cookies("UserPrefs") = "german"
les deux valeurs pour PREF1 et PREF2 seront remplacées et la propriété Count pour le cookie UserPrefs renverra 1. Alternativement, si vous envoyez une valeur de cookie ultérieure, en définissant une SubKey, à un ordinateur client où le cookie possède une valeur mais pas de clé, la valeur qui se trouve déjà sur l'ordinateur client est remplacée. Si, lors de la génération de valeurs pour la collection Cookies de l'objet Response, vous devez déterminer si des clés secondaires ont déjà été définies pour un cookie précis, vous pouvez évaluer la propriété HasKeys de ce cookie. Si des clés secondaires sont définies pour le cookie, la propriété HasKeys produit True. Comme les autres propriétés qui provoquent un changement des valeurs de l'en-tête de réponse HTTP, les valeurs de la collection Cookies doivent être définies avant que le serveur n'envoie la balise <HTML> au client, sauf si la réponse est placée en mémoire tampon.

AddHeader |
    ClientCustomHeader:CustomHeaderValue
Permet d'ajouter votre propre en-tête de réponse HTTP avec une valeur correspondante. Si vous ajoutez un en-tête HTTP possédant le même nom qu'un en-tête ajouté précédemment, le second sera envoyé en plus du premier ; l'ajout du second en-tête ne remplace pas la valeur du premier en-tête du même nom. En outre, lorsque l'en-tête a été ajouté à la réponse HTTP, il est impossible de le supprimer. Si le client envoie au serveur Web un en-tête HTTP différent de ceux qui figurent dans la section relative à la collection ServerVariables du chapitre 7, vous pouvez utiliser HTTP_HeaderName pour le récupérer. Par exemple, si le client envoie l'en-tête HTTP suivant :
    ClientCustomHeader:CustomHeaderValue
vous pouvez récupérer la valeur de cet élément à l'aide de la syntaxe suivante :
    <%
    Request.ServerVariables("HTTP_ClientCustomHeader")
    %>
Cette méthode est réservée aux utilisateurs expérimentés et ne doit pas être employée sans une planification minutieuse. Si une autre méthode de l'objet Response répond à vos besoins, employez-la au lieu de la méthode AddHeader.
Paramètres
strName Le nom de l'en-tête HTML à ajouter à l'en-tête de réponse. strValue La valeur initiale du nouvel en-tête que vous ajoutez à l'en-tête de réponse.
Exemple
    <%
    ' The following code adds the CUSTOM-ERROR HTML header to
    ' the HTTP response headers.
    Response.AddHeader "CUSTOM-ERROR", "Your browser is not IE."
    %>
Remarques
Tout comme les autres méthodes et propriétés de l'objet Response qui modifient les en-têtes de réponse HTTP, vous devez appeler la méthode AddHeader avant d'envoyer la balise <HTML> au client. Si vous avez précédemment fixé la valeur de la propriété Buffer de l'objet Response à True, vous pouvez employer AddHeader, sauf si vous avez appelé la méthode Flush auparavant. Si vous appelez AddHeader après avoir envoyé la balise <HTML> au client ou avoir appelé la méthode Flush, votre appel d'AddHeader provoquera une erreur d'exécution. N'employez pas de caractères de soulignement dans vos en-têtes personnalisés. Vous augmenteriez vos risques d'ambiguïté avec les en-têtes déjà présents. Pour séparer les mots, employez plutôt des tirets. Notre en outre que, pour récupérer la valeur d'un en-tête personnalisé contenant des tirets, vous devez remplacer ceux-ci par des caractères de soulignement.

AppendToLog |
Response.AppendToLog strLogEntry
Ajoute une chaîne à l'entrée de journal du serveur Web pour la demande client actuelle. Vous ne pouvez ajouter que 80 caractères à la fois, mais vous pouvez appeler la méthode AppendToLog à plusieurs reprises.
Enregistrement de l'activité d'un site Web
IIS vous permet d'enregistrer les activités des utilisateurs dans un fichier texte ou une base de données compatible ODBC. Ce journal est différent de la journalisation de Windows NT, et les enregistrements du journal d'IIS ne peuvent pas être consultés à l'aide de l'utilitaire Observateur d'événements de Windows NT. Pour visualiser les fichiers journaux d'IIS, vous devez les ouvrir comme n'importe quel autre fichier texte ASCII, les importer dans un logiciel de feuille de calcul ou de base de données ou, si vous avez effectué l'enregistrement dans une base de données ODBC, les consulter à l'aide d'interrogations de cette base de données. Les fichiers journaux d'IIS se trouvent dans winnt\system32\LogFiles\W3svc1\ex[date].log. Chaque entrée du journal (IIS par défaut) contient l'heure, l'adresse IP de l'appelant, la méthode d'appel (GET/POST), uri-stem (sans chemin de serveur)) et l'état résultant. Vous pouvez notamment enregistrer les aspects suivants des visites de votre site Web par les utilisateurs : Date/heure de la visite par l'utilisateur Pages demandées Adresse IP de l'utilisateur Durée de connexion au serveur Ces informations, et celles que votre application ajoute à ce journal via Response.AppendToLog, vous permettent de planifier l'évolution de votre site, la sécurité et l'ajout de nouveaux serveurs si la charge le justifie.
Paramètres
strLogEntry La chaîne à ajouter à l'entrée de la demande du client actuel sur le serveur Web. Cette chaîne peut comporter 80 caractères. Notez que la chaîne que vous ajoutez à l'entrée de journal du serveur Web ne peut pas contenir de virgules, car les champs des entrées de journal Web IIS sont délimitées par des virgules.
Exemple
    <%
    ' Assume you have constructed one string containing all that
    ' you'd like logged to the web's server. This string is
    ' declared as strOrigLogContent. The following Do...While
    ' loop code will loop through your content and log it to the
    ' web server 79 characters at a time.
    Do While Len(strOrigLogContent) > 0
       If Len(strOrigLogContent) >= 79 Then
          strLogString = Left(strOrigLogContent, 79)
       Else
          strLogString = strOrigLogContent
       End If

       ' Log the content.
       Response.AppendToLog strLogString

       If Len(strOrigLogContent) > Len(strLogString) Then
          strOrigLogContent = _
             Right(strOrigLogContent, _
             Len(strOrigLogContent) - Len(strLogString))
       Else
          strOrigLogContent = "
       End If
    Loop
    %>
Remarques
Avant de pouvoir ajouter des informations au journal du serveur Web d'IIS, vous devez activer l'option Requête URL de la page Propriétés du journal étendu du site Web dont les fichiers journaux consigneront l'activité. Cette méthode peut vous faire gagner un temps précieux lors de la gestion d'informations détaillées au sujet des actions sur votre site Web. Si vous attribuez un identificateur unique à chaque utilisateur stocké dans le fichier journal avec l'entrée (qui contient une adresse IP, éventuellement un nom de compte Windows NT et la date et l'heure de la visite), vous pouvez rapidement déterminer qui visitait le site au moment où une erreur imprévue s'y est produite. Si cette méthode n'est pas totalement sûre, car il est impossible d'être certain de l'identité de l'utilisateur, elle peut s'avérer utile.

BinaryWrite |
Request.BinaryWrite arbyteData
Écrit directement des informations dans le contenu de la réponse, sans la moindre conversion de caractères. Si votre application exige l'écriture de données binaires sur le client, vous devez utiliser cette méthode pour garantir que les données que vous envoyées ne sont pas converties en données de type caractère à partir des données binaires initiales.
Paramètres
arbyteData Une plage d'octets que vous voulez écrire dans le contenu de la réponse.
Exemple
L'exemple de code suivant est une manière plutôt longue d'effectuer l'appel simple de BinaryWrite, mais il présente un concept très utile, en particulier si vous devez manipuler des données binaires à partir d'une base de données.
    <%

    ' The following code retrieves a binary object
    ' (in this case a JPG image) and writes it to the
    ' client using BinaryWrite. (For more information
    ' on ActiveX Data Objects usage, see Chapter 12.)

    ' Create an ADO connection object.
    Set adoCon = Server.CreateObject("ADODB.Connection")

    ' Use the Open method of the Connection object
    ' to open an ODBC connection with the database
    ' represented by the DSN ImageDatabase.
    adoCon.Open "ImageDatabase"

    ' Use the Execute method of the ADO Connection object
    ' to retrieve the binary data field from the database.
    Set adoRecImgData = adoCon.Execute _
       ("SELECT ImageData FROM Images WHERE ImageId = 1234")

    ' Create a Field object by setting one equal to a
    ' specific field in the recordset created previously.
    Set adoFldImage = adoRecImgData("ImageData")

    ' Use the ActualSize property of Field object to retrieve
    ' the size of the data contained in the Field object. After
    ' this line you will know how many bytes of data reside in
    ' the Field object.
    lngFieldDataLength = adoFldImage.ActualSize

    ' Use the BinaryWrite method to write 4K bytes of binary
    ' data at a time. So, first we need to determine how many
    ' 4K blocks the data in the Field object represents.
    lngBlockCount = lngFieldDataLength / 4096

    ' Now let's get how many bytes are left over after removing
    ' lngBlockCount number of bytes.
    lngRemainingData = lngFieldDataLength Mod 4096

    ' We now must set the HTTP content type Response header
    ' so that the browser will recognize the data being sent
    ' as being JPEG image data.
    Response.ContentType = "image/JPEG"

    ' Loop through and write the first lngBlockCount number
    ' of binary blocks of data.
    For intCounter = 1 to lngBlockCount
       Response.BinaryWrite adoFldImage.GetChunk(4096)
    Next

    ' Now write the last remainder of the binary data.
    Response.BinaryWrite adoFldImage.GetChunk(lngRemainingData)

    ' Close the recordset.
    adoRecImgData.Close
    %>
Remarques
La méthode BinaryWrite semble à première vue n'avoir qu'une utilité restreinte, jusqu'à ce que vous deviez envoyer au client des données binaires stockées dans une base de données. À ce moment, BinaryWrite devient extrêmement précieuse. Comme le montre l'exemple de code, elle peut par exemple être très utile pour afficher des données d'image stockées et récupérées dans un SGBD capable de stocker des données binaires. Cette méthode s'est avérée plutôt efficace pour afficher des images JPEG stockées dans une base de données Microsoft SQL Server (à l'aide de code similaire à l'exemple précédent). Comme vous envoyez une réponse HTTP qui ne contient que les données d'image (et pas une demande de lien vers l'image), elle peut même être plus rapide que l'envoi d'images au client en cas de demande directe, pour autant que l'accès à votre base de données soit suffisamment rapide.

Clear |
Response.Clear
Vide le contenu actuel du tampon de Response. Cette opération s'effectue sans envoyer une quelconque partie de la réponse en mémoire tampon au client.
Paramètres
None
Exemple
    <% Response.Buffer = True%>
    <HTML>
    <HEAD><TITLE>Response Clear Method Example</TITLE></HEAD>
    <BODY>
    <%
    On Error Resume Next

    [CODE TO DO SOME CALCULATIONS]
    lngFormulaElement1 = 47
    lngFormulaElement2 = lngFormulaElement1 - 47
    lngFormulaElement3 = 23

    ' This next line results in a division-by-zero error
    ' (Error Number 11).
    lngNewCalcTotal = lngFormulaElement3 / lngFormulaElement2

    ' This next line will still be processed because we used
    ' ON ERROR RESUME NEXT.
    If Err <> 0 Then
       ' The following code clears the Response buffer, writes
       ' an error message, and ends the response, forcing IIS to
       ' send the response to the client. Note that the Buffer
       ' property has to be set to True for the following code
       ' to work properly.
       Response.Clear
       Response.Write "Your request resulted in the error: " & _
          Err.Description
       Response.Write " Error Number: " & Err.Number
       Response.Write "<BR>Call your web admin at 555-HELP for "
       Response.Write "more information."
       Response.End
    End If
    %>
    . . . [additional code]
Remarques
La méthode Clear de l'objet Response n'efface pas les en-têtes HTTP, mais uniquement le contenu. Comme l'indique l'exemple, la propriété Buffer de l'objet Response doit être fixée à True, faute de quoi l'emploi de cette méthode produira une erreur d'exécution. L'une des fonctions les plus importantes de la méthode Clear consiste à vider la mémoire tampon et à envoyer autre chose au navigateur client (il s'agit souvent d'informations relatives à une erreur), comme dans notre exemple. Pour qu'il soit possible de détecter les erreurs et d'envoyer des informations à leur sujet de cette manière, vous devez non seulement fixer la propriété Buffer à True, mais aussi utiliser la ligne de code suivante pour garantir le traitement de votre interception d'erreurs :
    On Error Resume Next

End |
Response.End
Termine le stockage d'informations dans le tampon de réponse et envoie immédiatement le contenu actuel de la mémoire tampon au client. Tout code présent après l'appel de la méthode End n'est pas traité. La mémoire réservée par le script jusqu'à l'appel de End (comme les objets de base de données utilisés précédemment dans le script) est libérée.
Paramètres
None
Exemple
Reportez-vous à l'exemple précédent, relatif à la méthode Clear.
Remarques
Si la propriété Buffer est fixée à True, l'appel de la méthode End vide le tampon de Response comme si vous aviez appelé la méthode Flush (reportez-vous à la section suivante). Toutefois, au contraire de l'appel de la méthode Flush, aucun code situé après l'appel de End n'est traité par le serveur Web.

Flush |
Response.Flush
Envoie immédiatement au client toutes les données qui se trouvent dans le tampon de réponse. Si la propriété Buffer de l'objet Response n'est pas fixée à True, cette méthode produit une erreur d'exécution. Cette méthode vous permet d'envoyer diverses portions de la réponse au client, comme bon vous semble.
Paramètres
None
Exemple
    <% Response.Buffer = True%>
    <HTML>
    <HEAD><TITLE>Response Flush Method Example</TITLE></HEAD>
    <BODY>
    <%
    ' Suppose for this example that this first part of the
    ' script retrieves some information from a database and
    ' that retrieval takes a long time, say 30 seconds.
    ' (Don't worry about the details of the ActiveX Data Object
    ' calls. They are covered later in the book and serve only
    ' as an example here of something that might take a long time.)
    Set adoCon = Server.CreateObject("ADODB.Connection")
    adoCon.Open MyDatabase
    Set adoRec = adoCon.Execute([BIG SQL STATEMENT])

    ' Rather than continue to the second part of the script, in
    ' which a second slow SQL statement (say another 15 seconds)
    ' executes, first we'll use the Flush method to force the
    ' first part of the script results to the client. This way,
    ' the user can be looking at the results of the first query
    ' while waiting for the second.
    Response.Flush

    ' [Second LONG SQL statement.]
    Set adoRec2 = adoCon.Execute([BIG SQL STATEMENT])
    %>
    </BODY></HTML>
Remarques
En utilisant la capacité de mise en mémoire tampon de l'objet Response, vous pouvez envoyer la réponse au client en plusieurs parties. Par exemple, supposons que vous présentiez une description de votre structure à l'échelle mondiale, suivie par une liste d'agences, au départ d'informations d'une base de données. La description de la structure ne contient que du texte, si bien que sa préparation et son envoi au client ne prennent que très peu de temps. La seconde partie prend plus de temps. Vous pouvez utiliser la méthode Flush de l'objet Response pour envoyer tout d'abord la description structurelle au client, puis envoyer la liste quand elle est prête. Sans cette approche, l'utilisateur peut avoir l'impression que le téléchargement de la page est trop lent. Un avertissement s'impose toutefois : si vous employez la méthode Flush sur une page ASP, le serveur ignorera les demandes Keep-Alive envoyées par le client pour cette page. Une nouvelle connexion devra dès lors être établie pour chaque élément d'information envoyé au client.

Redirect |
Response.Redirect strURL
Redirige la demande du client vers une autre URL.
Paramètres
strURL La chaîne URL pour le nouvel emplacement vers lequel vous voulez rediriger le client.
Exemple
    <%
    ' The following code determines whether the client has
    ' security clearance for a certain page. If not, it
    ' is redirected to another URL.
    [...Code to determine user's clearance for the current page...]

    If Not(strUserSecurity = "ADMIN" or strUserSecurity = "SUPERADMIN") Then
       Response.Redirect "/security/noclearance.asp?usrid=09563"
    End If
    %>
Remarques
La valeur strURL que vous utilisez lors de l'appel de la méthode Redirect peut être une URL exacte avec DNS ou un répertoire et un nom de fichier virtuels. Il peut également s'agir du nom d'un fichier qui se trouve dans le même dossier que la page demandée. Si votre script a écrit du contenu dans le corps de la réponse HTTP, ce contenu est ignoré par le script lorsque l'appel de la méthode Redirect est exécuté. L'appel de la méthode Redirect équivaut, d'un point de vue conceptuel, à fixer la propriété Status à "302 Object Moved" et à envoyer l'utilisateur vers un nouvel emplacement au moyen de l'en-tête HTTP Location. Notez que lors de la redirection, certains navigateurs clients plus anciens (HTTP 1.0) remplaceront par erreur les demandes POST par des demandes GET lorsque la nouvelle URL sera appelée. Il importe de tenir compte de cette remarque lorsque les informations envoyées (via POST) par le client contiennent plus de données que ce que la méthode GET peut prendre en charge. L'on suppose que les nouveaux navigateurs compatibles avec le protocole HTTP 1.1 ont corrigé ce problème. Si votre fichier ASP tourne sous IIS 5.0, il est conseillé d'envisager l'empli de la méthode de serveur Execute ou Transfer. Aucune de ces méthodes n'impliquent le fastidieux trajet vers le client puis de nouveau vers le serveur qui est requis par la méthode Redirect.

Write |
Response.Write vntData
Écrit directement des informations dans le corps de la réponse HTTP.
Paramètres
vntData Les informations à insérer dans le flux de texte HTML qui sera reçu par le navigateur client. Il peut s'agir de texte, de balises HTML, d'un script côté client, etc. Les variables de données du script ASP possèdent le type Variant. La valeur ne peut pas contenir la séquence de caractères %>, car le serveur Web l'interpréterait comme la fin de votre script de serveur actif. Si votre script exige cette séquence de caractères, utilisez plutôt la séquence d'échappement %\>.
Exemple
    <%
    strDirCommand = "Dir /w"

    ' The following code writes an entire HTML table to the HTTP
    ' response body.
    Response.Write "<TABLE>"
    Response.Write "<TR>"
    Response.Write "<TD WIDTH = 50%\>"
    Response.Write "Command"
    Response.Write "</TD>"
    Response.Write "<TD WIDTH = 50%\>"
    Response.Write "Description"
    Response.Write "</TD>"
    Response.Write "</TR>"
    Response.Write "<TR>"
    Response.Write "<TD WIDTH = 50%\>"
    Response.Write Chr(34) & strDirCommand & Chr(34)
    Response.Write "</TD>"
    Response.Write "<TD WIDTH = 50%\>"
    Response.Write "This allows you to see a list of the "
    Response.Write "files in <BR> your current folder."
    Response.Write "</TD>"
    Response.Write "</TR>"
    Response.Write "</TABLE>"
    %>
Remarques
Comme l'a montré l'exemple de programme, vous pouvez utiliser la méthode Write pour écrire du code HTML et un script côté client dans le corps de la réponse, que le navigateur client interprétera comme du code HTML ordinaire. Pour envoyer un retour chariot/saut de ligne ou un guillemet , utilisez la fonction Chr, comme dans le code suivant :
    ' Note:  Chr(34) is a quotation mark. Chr(13) & Chr(10) is
    ' the equivalent of a carriage return, followed by a
    ' linefeed.
    Response.Write "Hamlet said, " & Chr(34) & _
       "To be, or not to be." & Chr(34) & Chr(13) & Chr(10)
Enfin, vous pouvez employer la méthode Write pour envoyer la valeur d'un script côté serveur au navigateur client. Cette méthode peut parfois produire un code plus propre que les aller-retour entre du code côté serveur et du code côté client à l'aide de la notation <%=...%>. Par exemple, le code suivant affiche la valeur de la valeur de données strHighestPrice en utilisant les méthodes <%=...%> et Response.Write : %>
    <%
    Response.Write "The highest price is " & strHighestPrice
    Response.Write ".<BR>"

    ' The same line as the preceding using the other format:
    %>
    The highest price is <%=strhighestPrice%>.<BR>