2008-11-19 7 views
2

J'ai initialement utilisé WebRequest et WebResponse pour envoyer des messages Http Post. J'ai toujours eu une réponse de "OK". Le message que je poste est un XML signé avec un certificat dans le xml.HttpWebRequest Serveur indisponible 503 Problème

La composition est la suivante: Service C# qui envoie vers un site Web https. HTTPS Site Web sur un autre endroit que je ne peux pas dire. HTTPS Site Web local qui ne fait que recevoir les messages que je poste localement et qui écrit les résultats dans un fichier. Juste pour simuler ce que l'autre site obtient.

Site Web local est signé avec un certificat auto-signé expirer en 2048.

Ce code fonctionnait très bien jusqu'à cette semaine. J'ai toujours posté et obtenu un OK. Dans les deux sites Web. Mais cette semaine, le test et la mise en œuvre du projet vont tous deux à Kaput. Sur les deux sites Web.
Sur le site Web local, il était impossible de se connecter à SSL. Ce problème est causé par le certificat autosigné qui, pour une raison qui dépasse mon entendement, est un enfer. Grâce aux questions que je viens de poser, je viens de valider le certificat pour qu'il soit toujours vrai et maintenant il ne fonctionne plus.

Pour résoudre ce problème il suffit d'écrire ceci:

ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy(); 

Au début de votre application. Alors que ça ne marche qu'une seule fois.

Le problème restant est "Le serveur distant a renvoyé une erreur: (503) Server Unavailable.". Je saisis l'URL dans mon navigateur et cela fonctionne très bien pour moi. Dans le code ce site ne reçoit rien et quand il va à la réponse web il me donne l'erreur ci-dessus

J'ai fait une application de test qui envoie seulement "Testing 1 2 3" mais je continue à obtenir l'erreur. Je l'ai également envoyé à un site Web harvard https et il n'y avait pas d'erreurs.

private void btnSend_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      WebRequest req = WebRequest.Create(cboUrl.Text); 
      req.PreAuthenticate = true; 
      req.UseDefaultCredentials = true; 
      req.Method = "POST"; 
      req.ContentType = "text/xml"; 
      String msg = txtMsg.Text; 

      using (Stream s = req.GetRequestStream()) 
      { 
       try 
       { 
        s.Write(
         System.Text.ASCIIEncoding.ASCII.GetBytes(msg), 0, msg.Length); 
       } 
       finally 
       { 
        s.Close(); 
       } 
      } 

      WebResponse resp = req.GetResponse(); 
      StreamReader str = new StreamReader(resp.GetResponseStream()); 

      txtRes.Text = str.ReadToEnd(); 
     } 
     catch (WebException ex) 
     { 
      txtRes.Text = ex.Message; 
     } 
     catch (Exception ex) 
     { 
      txtRes.Text = ex.Message; 
     } 

    } 

Ceci est un autre exemple que je construit à partir de ce que je trouve sur Internet:

private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 

      HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(cboUrl.Text); 
      myReq.Headers.Clear(); 
      myReq.Method = "POST"; 
      myReq.KeepAlive = false; 
      myReq.ProtocolVersion = HttpVersion.Version11; 
      myReq.ContentType = "text/xml"; 
      myReq.Proxy = null; 
      myReq.Credentials = null; 
      myReq.ContentLength = txtMsg.Text.Length; 
      using (StreamWriter sendingData = new StreamWriter(myReq.GetRequestStream())) 
      { 
       sendingData.Write(txtMsg.Text); 
       sendingData.Flush(); 
       sendingData.Close(); 
      } 

      HttpWebResponse myResponse = (HttpWebResponse) myReq.GetResponse(); 
      StreamReader responseStream = new StreamReader(myResponse.GetResponseStream()); 
      txtRes.Text = responseStream.ReadToEnd(); 

      responseStream.Close(); 
      myResponse.Close(); 

     } 
     catch(WebException ex) 
     { 
      txtRes.Text = ex.Message; 
     } 
     catch (Exception ex) 
     { 
      txtRes.Text = ex.Message; 
     } 


    } 

Mise à jour

erreur était que celui que j'appelais avec HttpWebRequest, avait besoin de httpHeaders que Je ne fournissais pas. Avant que la seule chose qui s'est passé était que j'ai eu une réponse "OK". Ils ont corrigé leur code et j'ai réparé le mien et maintenant ça marche.

Si cela arrive à quelqu'un d'autre vérifier comme celui ci-dessous dit les paramètres de proxy et aussi vérifier si l'autre côté donne une exception ou ne retourne rien du tout.

Répondre

3

Si vous n'êtes pas recieving une erreur 503 lorsque vous naviguez vers l'URL dans votre navigateur, mais ne le recevoir lors de la demande de la ressource lors de l'utilisation HttpWebRequest, la première chose que je recommande est que vous spécifiez une valeur pour le UserAgent lors de la demande.

Vous pouvez également utiliser Fiddler2 ou un autre outil pour avoir une meilleure idée de ce qui se passe pendant la durée de vie de la demande. Il est difficile de fournir des conseils sans en savoir plus sur les détails du service auquel vous envoyez des messages.

1

Le problème semble être que ce site a changé. Avant si j'ai envoyé un message avec n'importe quelle ordure cela retournerait l'OK d'habitude. Ils ont changé le site Web et il y a des en-têtes http requis. Hier, j'ai eu les en-têtes http pour toute la journée et la nuit était quand ça a marché. Dans mon cas, c'est qu'il attendait les en-têtes http et ne les recevait pas et peut-être que quelque chose explose.

Je l'ai testé aujourd'hui en donnant les en-têtes et ne donnant pas les en-têtes http et dans ce dernier cas, il a fait le 503.

Si je trouve plus d'informations, je vais essayer de poster ici. J'espère que cela économise du temps et des cheveux à d'autres personnes :).

1

J'ai eu un problème similaire avec l'erreur 503, mais la raison en était proxy. Si vous avez proxy, il suffit d'utiliser ceci:

request.Proxy = null;

request.Credentials = System.Net.CredentialCache.DefaultCredentials;

1

Si vous réinitialiser IIS assurez-vous que vous ne l'avez pas changé votre mot de passe récemment. Idiot mais ça arrive.

Questions connexes