validar - cURL con autenticación de usuario en C#
usuarios en c# (3)
La autenticación básica HTTP requiere que todo lo que se encuentre después de "Básico" esté codificado en Base64, así que intente
request.Headers["Authorization"] = "Basic " +
Convert.ToBase64String(Encoding.ASCII.GetBytes(authInfo));
Deseo hacer la siguiente solicitud de cURL en c #:
curl -u admin:geoserver -v -XPOST -H ''Content-type: text/xml'' /
-d ''<workspace><name>acme</name></workspace>'' /
http://localhost:8080/geoserver/rest/workspaces
He intentado usar una WebRequest:
string url = "http://localhost:8080/geoserver/rest/workspaces";
WebRequest request = WebRequest.Create(url);
request.ContentType = "Content-type: text/xml";
request.Method = "POST";
request.Credentials = new NetworkCredential("admin", "geoserver");
byte[] buffer = Encoding.GetEncoding("UTF-8").GetBytes("<workspace><name>my_workspace</name></workspace>");
Stream reqstr = request.GetRequestStream();
reqstr.Write(buffer, 0, buffer.Length);
reqstr.Close();
WebResponse response = request.GetResponse();
...
Pero recibo un error: (400) Solicitud incorrecta.
Si cambio las credenciales de solicitud y agrego la autenticación en el encabezado:
string url = "http://localhost:8080/geoserver/rest/workspaces";
WebRequest request = WebRequest.Create(url);
request.ContentType = "Content-type: text/xml";
request.Method = "POST";
string authInfo = "admin:geoserver";
request.Headers["Authorization"] = "Basic " + authInfo;
byte[] buffer = Encoding.GetEncoding("UTF-8").GetBytes("<workspace><name>my_workspace</name></workspace>");
Stream reqstr = request.GetRequestStream();
reqstr.Write(buffer, 0, buffer.Length);
reqstr.Close();
WebResponse response = request.GetResponse();
...
Entonces obtengo: (401) No autorizado.
Mi pregunta es: ¿Debo usar otra clase C # como WebClient o HttpWebRequest o tengo que usar los enlaces curl para .NET?
Todos los comentarios u orientación serán apreciados.
La solución a mi pregunta fue cambiar la propiedad ContentType . Si cambio el ContentType a
request.ContentType = "text/xml";
la solicitud funciona en ambos casos, si también convierto el authInfo a un Base64String en el último ejemplo, como sugirió Anton Gogolev .
Utilizando:
request.ContentType = "application/xml";
request.Credentials = new NetworkCredential(GEOSERVER_USER, GEOSERVER_PASSWD);
también funciona El segundo establece la información de autenticación.