Domanda

Sto cercando di trasformare un semplice post HTTP in un endpoint con SOLO argomenti url.

Almeno così capisco le seguenti istruzioni:

  

POST a quell'indirizzo con un singolo parametro chiamato url, l'indirizzo del feed che è cambiato.

     

Come con il metodo XML-RPC, verifica che il feed sia cambiato e, in tal caso, avvisa gli abbonati.

     

L'evento è registrato. Il valore restituito è un messaggio XML denominato risultato, con due attributi, esito positivo e msg.

Questo è il mio codice attualmente:

        public static void ping(string feed)
    {
        HttpWebResponse response = MakeRequest(feed);
        XmlDocument document = new XmlDocument();

        document.Load(response.GetResponseStream();
        string success = document.GetElementById("success").InnerText;
        string msg = document.GetElementById("msg").InnerText;

        MessageBox.Show(msg, success);
    }
        private static HttpWebResponse MakeRequest( string postArgument)
    {
        string url = path + "?" + UrlEncode(postArgument);
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        return (HttpWebResponse)request.GetResponse();
    }
    private static string UrlEncode( string value)
    {
        string result;
        result= HttpUtility.UrlEncode("url") + "=" + HttpUtility.UrlEncode(value);
        return result;
    }

Ricevo una risposta errata dal server, quindi presumo che in qualche modo stia sbagliando. ecco la risposta:

  

Non valido al livello superiore del documento. Errore durante l'elaborazione del file della risorsa: /// C: /Users/ADMIN/AppData/Local/Temp/VSD1.tmp.XML ...

     

rue   ^

Qualche idea ??

Grazie in anticipo

È stato utile?

Soluzione 3

Ecco il codice che ho trovato funzionare.

Utilizziamo un POST HTTP, che codifica i parametri nel corpo del flusso. Questo ci dà "url-foobar" come corpo dei contenuti. Nessun tipo di contenuto, disposizione, confine, ecc. Nel corpo.

        private static HttpWebResponse MakeRequest(string path, string postArgument)
    {
        //string url = path + "?" + UrlEncode(postArgument);
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(path);

        request.Method = "POST";
        string boundary = Guid.NewGuid().ToString().Replace("-", "");
        request.ContentType = "multipart/form-data; boundary=" + boundary;
        Stream stream = request.GetRequestStream();
        string result = string.Format("url={0}", postArgument);
        byte[] value = Encoding.UTF8.GetBytes(result);
        stream.Write(value, 0, value.Length);
        stream.Close();

        return (HttpWebResponse)request.GetResponse();
    }
        public static void ping(string server, string feed)
    {
        HttpWebResponse response = MakeRequest(server, feed);
        XmlDocument document = new XmlDocument();
        string result = GetString(response.GetResponseStream());
        try
        {
            document.LoadXml(result);
        }
        catch
        {
            MessageBox.Show("There was an error with the response", "Error");
        }
        //MessageBox.Show(msg, success);

    }
    public static string GetString(Stream thestream)
    {
        int n = thestream.ReadByte();
        byte[] bytes = new byte[n];
        thestream.Read(bytes, 0, n);
        return Encoding.ASCII.GetString(bytes);
    }

Le chiamate a GetString sono solo a scopo di debug e non sono strettamente necessarie.

Grazie per tutti quelli che sono intervenuti qui per avermi messo sulla strada giusta.

Altri suggerimenti

Non conosco l'API di .NET, ma: comprendo le istruzioni come: " esegui un post sull'URL con gli argomenti della query " ;, e il corpo del post dovrebbe avere il parametro url = foobar.

IOW: invece di prendere il postArgument e aggiungerlo all'URL, dovresti chiamare l'URL e fornire l'URL = foobar correttamente codificato nel corpo del messaggio.

Inoltre: non vedo che stai impostando l'intestazione "Accetta" della richiesta, che può essere importante se il server lo utilizza per riconoscere con quale formato rispondere.

Il modo migliore per eseguire un post di moduli in .NET è utilizzare la classe WebClient. Quella classe farà la cosa giusta per inviare i dati, sia come POST (con parametri nel corpo dell'entità) sia come GET (con parametri codificati come argomenti della stringa di query).

E devi mostrarci l'eccezione effettiva che il cliente sta restituendo, per capire cosa c'è che non va.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top