Pregunta

Estoy tratando de hacer que una publicación HTTP simple sea un punto final con SOLO argumentos de URL.

Al menos así es como entiendo las siguientes instrucciones:

  

PUBLICAR en esa dirección con un único parámetro llamado url, la dirección del feed que cambió.

     

Al igual que con el método XML-RPC, verifica que el feed ha cambiado y, de ser así, notifica a los suscriptores.

     

El evento se registra. El valor de retorno es un mensaje XML denominado resultado, con dos atributos, éxito y mensaje.

Este es mi código actualmente:

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

Recibo una respuesta incorrecta del servidor, así que supongo que lo estoy haciendo mal de alguna manera. Aquí está la respuesta:

  

No válido en el nivel superior del documento. Error al procesar el archivo de recursos: /// C: /Users/ADMIN/AppData/Local/Temp/VSD1.tmp.XML ...

     

rue   ^

¿Alguna idea?

Gracias de antemano

¿Fue útil?

Solución 3

Aquí está el código que he encontrado que funciona.

Utilizamos un HTTP POST, que codifica los parámetros en el cuerpo de la secuencia. Esto nos da "url-foobar" como el cuerpo del contenido. No hay tipos de contenido, disposiciones, límites, etc. en el cuerpo.

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

Las llamadas a GetString son solo para fines de depuración y no son estrictamente necesarias.

Gracias a todos los que intervinieron aquí por ponerme en el camino correcto.

Otros consejos

No conozco la API de .NET, pero: entiendo las instrucciones como: "ejecutar una publicación en la URL con los argumentos de consulta", y el cuerpo de la publicación debe tener el parámetro url = foobar.

IOW: en lugar de tomar el postArgument y agregarlo a la url, se supone que debe llamar a la url y proporcionar la url = foobar codificada correctamente en el cuerpo del mensaje.

Además: no te veo configurando el encabezado 'Aceptar' de la solicitud, que puede ser importante si el servidor usa eso para reconocer con qué formato responder.

La mejor manera de hacer una publicación de formularios en .NET es usar la clase WebClient. Esa clase hará lo correcto para enviar los datos, ya sea como POST (con parámetros en el cuerpo de la entidad) o como GET (con parámetros codificados como argumentos de cadena de consulta).

Y debe mostrarnos la excepción real que el cliente está devolviendo, para descubrir qué está mal ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top