Pourquoi suis-je recevoir « (304) Non modifié » erreur sur certains liens lors de l'utilisation HttpWebRequest?
-
25-09-2019 - |
Question
Toutes les idées pourquoi certains liens que je tente d'accéder à l'aide HttpWebRequest je reçois « Le serveur distant a renvoyé une erreur: (304) Non modifié. » dans le code?
Le code J'utilise est de poste Jeff (la page semble avoir disparu, voir un copie d'archives à la Wayback machine).
Notez le concept du code est un simple serveur proxy, donc je suis pointant mon navigateur à cette pièce en cours d'exécution locale de code, qui obtient ma demande de navigateurs, puis proxie sur en créant une nouvelle HttpWebRequest, comme vous » ll voir dans le code. Il fonctionne très bien pour la plupart des sites / liens, mais pour une cette erreur arrive. Vous verrez un bit clé dans le code est là où il semble copier les paramètres d'en-tête HTTP de la requête du navigateur à la demande de sortir du site, et il copie dans les attributs d'en-tête. Je ne sais pas si le problème est quelque chose à voir avec la façon dont il imite cet aspect de la demande et ce qui se passe à la suite revient?
case "If-Modified-Since":
request.IfModifiedSince = DateTime.Parse(listenerContext.Request.Headers[key]);
break;
Je reçois la question par exemple de http://en.wikipedia.org/wiki/Main_Page
PS. ICI UPDATE
ne peut toujours pas travailler cela. Fondamentalement, je peux identifier 1 lien qui a un problème, et il semble fonctionner correctement, 2e temps, il obtient l'erreur, 3ème fois OK, 4ème fois obtient l'erreur, 5ème fois OK, etc. Comme il y a un état ne s'effacé ou quelque chose dans le code. J'ai essayé de nettoyer un peu le code à l'aide « à l'aide des » énoncés de type etc.
Voici le code. Si quelqu'un peut repérer pourquoi chaque 2ème fois que j'accédez à un lien comme http://newsimg.bbc.co.uk/css/screen/1_0_16/nol/v4/story.css (à partir de la 2ème fois, pas le premier) via ce code proxy je reçois l'erreur I adorerais entendre.
class Program
{
static void Main(string[] args)
{
Proxy p = new Proxy(8080);
Thread proxythread = new Thread(new ThreadStart(p.Start));
proxythread.Start();
Console.WriteLine("Proxy Started. Press Any Key To Stop...");
Console.ReadKey();
p.Stop();
}
}
public class Proxy
{
private HttpListener _listener;
private int _port;
public Proxy(int port)
{
int defaultport = 8080;
// Setup Thread Pool
System.Threading.ThreadPool.SetMaxThreads(50, 1000);
System.Threading.ThreadPool.SetMinThreads(50, 50);
// Sanitize Port Number
if (port < 1024 || port > 65535)
port = defaultport;
// Create HttpListener Prefix
string prefix = string.Format("http://*:{0}/", port);
_port = port;
// Create HttpListener
_listener = new HttpListener();
_listener.Prefixes.Add(prefix);
}
public void Start()
{
_listener.Start();
while (true)
{
HttpListenerContext request = null;
try
{
request = _listener.GetContext();
// Statistics (by Greg)
int availThreads = -1;
int compPortThreads = -1;
ThreadPool.GetAvailableThreads(out availThreads, out compPortThreads);
log("INFO", request.Request.Url.ToString(), "START - [" + availThreads + "]");
ThreadPool.QueueUserWorkItem(ProcessRequest, request);
}
catch (HttpListenerException ex)
{
log("ERROR", "NA", "INFO: HttpListenerException - " + ex.Message);
break;
}
catch (InvalidOperationException ex)
{
log("ERROR", "NA", "INFO: InvalidOperationException - " + ex.Message);
break;
}
}
}
public void Stop()
{
_listener.Stop();
}
private void log(string sev, string uri, string message)
{
Console.Out.WriteLine(Process.GetCurrentProcess().Id + " - " + sev + " (" + uri + "): " + message);
}
private void ProcessRequest(object _listenerContext)
{
#region local variables
HttpWebRequest psRequest; // Request to send to remote web server
HttpWebResponse psResponse; // Response from remote web server
List<byte> requestBody = new List<byte>(); // Byte array to hold the request's body
List<byte> responseBody = new List<byte>(); // Byte array to hold the response's body
byte[] buffer;
string uri = "";
#endregion
var listenerContext = (HttpListenerContext)_listenerContext;
uri = listenerContext.Request.Url.ToString().Replace(string.Format(":{0}", _port), "");
// Create Interent Request
HttpWebRequest internetRequest = (HttpWebRequest)WebRequest.Create(uri);
#region Build Request Up
internetRequest.Method = listenerContext.Request.HttpMethod;
internetRequest.ProtocolVersion = listenerContext.Request.ProtocolVersion;
internetRequest.UserAgent = listenerContext.Request.UserAgent;
foreach (string key in listenerContext.Request.Headers.AllKeys)
{
try
{
switch (key)
{
case "Proxy-Connection":
case "Connection":
internetRequest.KeepAlive = (listenerContext.Request.Headers[key].ToLower() == "keep-alive") ? true : false;
break;
case "Content-Length":
internetRequest.ContentLength = listenerContext.Request.ContentLength64;
break;
case "Content-Type":
internetRequest.ContentType = listenerContext.Request.ContentType;
break;
case "Accept":
internetRequest.Accept = listenerContext.Request.Headers[key];
break;
case "Host":
break;
case "Referer":
internetRequest.Referer = listenerContext.Request.Headers[key];
break;
case "If-Modified-Since":
internetRequest.IfModifiedSince = DateTime.Parse(listenerContext.Request.Headers[key]);
break;
default:
internetRequest.Headers.Add(key, listenerContext.Request.Headers[key]);
break;
}
}
catch (Exception ex)
{
Console.WriteLine("Error settup up psRequest object. Error = " + ex.Message + "\n" + ex.StackTrace);
}
}
#endregion
#region Copy content into request
buffer = new byte[1024];
using (Stream instream = listenerContext.Request.InputStream)
{
int incount = instream.Read(buffer, 0, buffer.Length);
while (incount > 0)
{
internetRequest.GetRequestStream().Write(buffer, 0, incount);
incount = instream.Read(buffer, 0, buffer.Length);
}
}
#endregion
// Get Internet Response
HttpWebResponse internetResponse = null;
try
{
using (internetResponse = (HttpWebResponse)internetRequest.GetResponse())
{
#region Configure Local Response Header Keys
foreach (string key in internetResponse.Headers.Keys)
{
try
{
switch (key)
{
case "Transfer-Encoding":
listenerContext.Response.SendChunked = (internetResponse.Headers[key].ToLower() == "chunked") ? true : false;
break;
case "Content-Length":
listenerContext.Response.ContentLength64 = internetResponse.ContentLength;
break;
case "Content-Type":
listenerContext.Response.ContentType = internetResponse.Headers[key];
break;
case "Keep-Alive":
listenerContext.Response.KeepAlive = true;
break;
default:
listenerContext.Response.Headers.Add(key, internetResponse.Headers[key]);
break;
}
}
catch (Exception ex)
{
log("ERROR", uri, "Error settup up listenerContext.Response objects. Error = " + ex.Message + "\n" + ex.StackTrace);
}
}
#endregion
try
{
// Transfer the body data from Internet Response to Internal Response
buffer = new byte[1024];
using (Stream inputStream = internetResponse.GetResponseStream())
{
int outcount = inputStream.Read(buffer, 0, buffer.Length);
while (outcount > 0)
{
listenerContext.Response.OutputStream.Write(buffer, 0, outcount);
outcount = inputStream.Read(buffer, 0, buffer.Length);
}
}
}
catch (Exception ex)
{
log("ERROR", uri, "Could not obtain response from URI: " + ex.Message);
}
finally
{
listenerContext.Response.OutputStream.Close();
}
}
}
catch (Exception ex)
{
//if (ex is InvalidOperationException ||
// ex is ProtocolViolationException ||
// ex is WebException)
//{
// log(uri, "Could not successfully get response: " + ex.GetType() + " - " + ex.Message);
// listenerContext.Response.Close();
// return;
//}
//else { throw; }
log("ERROR", uri, "Could not successfully get response: " + ex.GetType() + " - " + ex.Message);
listenerContext.Response.Close();
}
}
}
Et voici un exemple de ce que je vois - premier coup est bon, 2ème erreur a ...
Proxy Started. Press Any Key To Stop...
2080 - INFO (http://newsimg.bbc.co.uk:8080/css/screen/1_0_16/nol/v4/story.css): START - [50]
2080 - INFO (http://newsimg.bbc.co.uk:8080/css/screen/1_0_16/nol/v4/story.css): START - [50]
2080 - ERROR (http://newsimg.bbc.co.uk/css/screen/1_0_16/nol/v4/story.css): Could not successfully get response: System.Net.WebException - The remote server returned an error: (304) Not Modified.
La solution
D'abord, ce n'est pas une erreur. 3xx
indique une redirection. Les erreurs réelles sont 4xx
(erreur client) et < a href = "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5" rel = "noreferrer"> 5xx
(erreur de serveur).
Si un client obtient un 304 Not Modified
, puis il est de la responsabilité du client pour afficher la resouce en question de son propre cache. En général, la procuration ne devrait pas inquiéter à ce sujet. Il est juste le messager.
Autres conseils
Ceci est prévu le comportement.
Lorsque vous effectuez une requête HTTP, le serveur renvoie normalement 200 OK
de code. Si vous définissez If-Modified-Since
, le serveur peut retourner 304 Not modified
(et la réponse n'aura pas le contenu). Ceci est censé être votre signal que la page n'a pas été modifiée.
Les de la classe ont bêtement décidé que 304
doit être traité comme une erreur et lancer une exception. Maintenant, vous devez nettoyer après eux en attrapant l'exception chaque fois que vous essayez d'utiliser If-Modified-Since
.
en appuyant simplement sur F5 est pas toujours travailler.
pourquoi?
Parce que votre fournisseur d'accès Internet est mise en cache également des données Web pour vous.
Solution:. Force Actualiser
Force rafraîchir votre navigateur en appuyant sur CTRL + F5 dans Firefox ou Chrome trop Effacez le cache fournisseur d'accès Internet, au lieu de simplement appuyer sur F5
Vous pouvez alors voir la réponse 200 au lieu de 304 dans le navigateur F12 onglet Réseau d'outils de développement.
Une autre astuce consiste à ajouter un point d'interrogation ?
à la fin de la chaîne URL de la page demandée:
http://localhost:52199/Customers/Create?
La marque question veillera à ce que le navigateur rafraîchir la demande sans mise en cache des requêtes précédentes.
De plus Visual Studio vous pouvez définir le navigateur par défaut Chrome Incognito mode pour éviter les problèmes de cache tout en développant, en ajoutant Chrome le mode incognito comme navigateur par défaut, voir les étapes (auto illustré):
Je pense que vous ne l'avez pas installé ces fonctions. voir ci-dessous dans l'image.
Je souffrais aussi de ce problème il y a quelques jours. Après avoir installé cette fonction alors je l'ai résolu. Si vous ne l'avez pas installé cette fonction installée il.
Installer processus:
- aller en studio Android
- Outils
- Android
- SDK directeur
- Apparence et comportement
- SDK Android