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 :
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 | |
|
|
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 | |
|
|
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 | |
|
|
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 | |||||||||||||||||||||||||
|
|||||||||||||||||||||||||
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.
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 | |
|
|
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 | |
|
|
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 | |
|
|
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 :
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 | |
|
|
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 :
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 :
|
|
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 ( <% ' 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 | |
|
|
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 Vous pouvez notamment enregistrer les aspects suivants des visites de votre site Web par les utilisateurs :
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 | |
|
|
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 | |
|
|
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 %> |
|
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 | |
|
|
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 | |
|
|
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 ' 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> |
|