Question

À l'origine, j'avais utilisé WebRequest et WebResponse pour envoyer des messages post HTTP. J'ai toujours reçu la réponse "OK". Le message que je poste est un fichier XML signé avec un certificat au format xml.

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

Le site Web local est signé avec un certificat auto-signé qui doit expirer en 2048.

Ce code fonctionnait bien jusqu'à cette semaine. J'ai toujours posté et obtenu un OK. Dans les deux sites. Mais cette semaine, le test et la mise en œuvre réelle du projet vont tous deux à Kaput. Sur les deux sites Web.
Sur le site Web local, il était indiqué qu'il était impossible de se connecter à SSL. Ce problème est causé par le certificat auto-signé qui, pour une raison au-delà de ma compréhension, est un enfer. Grâce aux questions ici, je viens de valider que le certificat soit toujours vrai et maintenant, il n’a plus aucun problème.

Pour résoudre ce problème, écrivez simplement ceci:

ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy();

Au début de votre application. Pour qu’il ne fonctionne qu’une fois.

Le problème restant est "Le serveur distant a renvoyé une erreur: (503) Serveur indisponible". J'entre l'URL dans mon navigateur et cela fonctionne très bien pour moi. Dans le code, ce site Web ne reçoit rien et s’il accède à la réponse Web, il me donne l’erreur ci-dessus

J'ai créé une application de test qui envoie uniquement "Test 1 2 3". mais je continue à avoir l'erreur. Je l'ai également envoyé sur un site Web harvard https et il n'y a pas eu d'erreur.

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;
        }

    }

C’est un autre exemple que j’ai construit à partir de ce que j’ai trouvé 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;
        }


    }

Mettre à jour

L’erreur était que celui que j’appelais avec httpwebrequest avait besoin de httpheaders que je ne fournissais pas. Avant, la seule chose qui se passait, c’était que j’avais reçu un "OK". réponse. Ils ont corrigé leur code et j'ai corrigé le mien et maintenant, il fonctionne.

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

Était-ce utile?

La solution

Si vous ne recevez pas une erreur 503 lors de la navigation vers l'URL de votre navigateur, mais que do le recevez lors de la demande de la ressource lors de l'utilisation de HttpWebRequest, la première chose que je Il est recommandé de spécifier une valeur pour UserAgent lors de la requête.

Vous pouvez également utiliser Fiddler2 ou un autre outil pour obtenir une meilleure idée de la 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.

Autres conseils

Le problème semble être que ce site Web a changé. Avant, si j’envoyais un message avec un courrier indésirable, il renverrait l’habituel OK. Ils ont changé le site Web et certains en-têtes HTTP sont requis. Hier, j’avais les en-têtes http pour toute la journée et la nuit, c’était quand ça fonctionnait. Dans mon cas, c’est qu’il attend les en-têtes http sans les obtenir et que quelque chose explose peut-être.

Je l’ai testé aujourd’hui en donnant les en-têtes et non les en-têtes http et dans ce dernier cas, il a utilisé le 503.

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

J'ai eu un problème similaire. Grâce au conseil de Fiddler, j'ai découvert que cela était dû aux paramètres de proxy de mon nouvel environnement de développement. Très ennuyant. Les services Web .NET adoptent les paramètres de proxy définis dans IE.

Pour plus d'informations, consultez la page http://support.microsoft.com/kb/307220 et http://msdn.microsoft.com/en-us/ bibliothèque / kd3cf2ex.aspx .

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

request.Proxy = null;

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

Si vous réinitialisez IIS, assurez-vous de ne pas avoir récemment changé de mot de passe. Stupide mais ça arrive.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top