2010-12-07 83 views
0

J'essaie de diffuser des données générées dynamiquement à un client via HTTP à l'aide d'IIS, et la connexion doit rester ouverte pendant une longue période. Le serveur envoie des mises à jour d'état périodiques au client pendant qu'il effectue une opération qui prend du temps.Comment forcer IIS à envoyer des en-têtes de réponse sans envoyer le corps de la réponse et fermer la connexion

Cela DOIT être traité dans une seule requête, mais j'utilise un flux WebClient.OpenRead(), qui ne peut pas être ouvert tant que les en-têtes ne sont pas envoyés.

Comment puis-je forcer IIS à envoyer des en-têtes au client et envoyer plus tard un corps de réponse?

Répondre

1

Ce comportement est normalement réalisable en définissant KeepAlive sur true et en définissant l'en-tête Expect sur "100 et continuer". En faisant cela, le serveur enverra les en-têtes avec le code de résultat 100.

Je ne suis pas sûr que cela soit possible avec WebClient.


Utilisez plutôt HttpWebRequest pour pouvoir définir les valeurs ci-dessus. En fait, WebClient ne fait rien de magique mais utilise GET pour obtenir les données. Voici le code pour appeler OpenRead réflecteur:

try 
    { 
     request = this.m_WebRequest = this.GetWebRequest(this.GetUri(address)); 
     Stream responseStream = (this.m_WebResponse = this.GetWebResponse(request)).GetResponseStream(); 
     if (Logging.On) 
     { 
      Logging.Exit(Logging.Web, this, "OpenRead", responseStream); 
     } 
     stream2 = responseStream; 
    } 
    catch (Exception exception) 
    { 
    // 
+0

qui ne fonctionne pas, parce que les deux KeepAlive et Expect sont en-têtes, qui ne sont pas envoyés jusqu'à ce que le corps a contenu soit. En raison de la nature du programme, la connexion socket ne peut être fermée pour aucune raison avant que l'opération complète sur le serveur ne soit terminée et toutes les mises à jour d'état ont été envoyées au client. J'essaie de trouver un moyen d'envoyer les en-têtes avant d'envoyer le corps. – IDWMaster

+0

Les en-têtes sont définis au moment de l'envoi de la requête et il est possible de le faire, mais ils ont été limités dans WebCLient. Pourquoi ne pas utiliser HttpWebRequest? – Aliostad

+0

J'ai mis à jour ma réponse. – Aliostad