Estoy intentando usar un servicio web en una aplicación web C# ASP.Net. El servicio está construido en PHP y está ubicado en algún servidor remoto que no está bajo mi control, así que no puedo modificarlo para agregar metadatos o algo más.¿Cómo acceder a un servicio web PHP desde ASP.Net?
Cuando utilizo la opción "Agregar referencia Web" en Visual Studio 2008, recibo el siguiente error:
The HTML document does not contain Web service discovery information.
al intentar añadir el siguiente servicio web.
https://subreg.forpsi.com/robot2/subreg_command.php?wsdl
Las funciones de servicios web se exponen y se muestran en Visual Studio 2008. Sin embargo no pude agregar la referencia a la misma para su uso en ASP.Net aplicación.
t3Service" Description
Methods __construct ()
create_contact ()
get_contact ()
get_domain_info ()
get_last_error_code ()
get_last_error_msg ()
get_NSSET ()
get_owner_mail ()
login ()
register_domain ()
register_domain_with_admin_contacts ( )
renew_domain ()
request_sendmail ()
send_auth_info ()
transfer_domain ()
También probé el método wsdl.exe recuperando el XML y lo copia a un archivo WSDL y genera una clase de proxy. Pero la salida wsdl contiene advertencias y la clase proxy generada salta las funciones expuestas y genera algo como esto:
// CODEGEN: Se ignoró el enlace de la operación 'create_contact' del espacio de nombres 'urn: t3'. Cada parte del mensaje en un mensaje use = encoded debe especificar un tipo. // CODEGEN: se ignoró el enlace de operación 'get_contact' del espacio de nombres 'urn: t3'. Cada parte del mensaje en un mensaje use = encoded debe especificar un tipo. // CODEGEN: se ignoró el enlace de operación 'get_domain_info' del espacio de nombres 'urn: t3'. Cada parte del mensaje en un mensaje use = encoded debe especificar un tipo. // CODEGEN: Se ignoró el enlace de operación 'get_last_error_code' del espacio de nombres 'urn: t3'. Cada parte del mensaje en un mensaje use = encoded debe especificar un tipo. // CODEGEN: se ignoró el enlace de operación 'get_last_error_msg' del espacio de nombres 'urn: t3'. Cada parte del mensaje en un mensaje use = encoded debe especificar un tipo. // CODEGEN: se ignoró el enlace de operación 'get_NSSET' del espacio de nombres 'urn: t3'. Cada parte del mensaje en un mensaje use = encoded debe especificar un tipo. // CODEGEN: se ignoró el enlace de operación 'get_owner_mail' del espacio de nombres 'urn: t3'. Cada parte del mensaje en un mensaje use = encoded debe especificar un tipo. // CODEGEN: se ignoró el enlace de la operación 'send_auth_info' del espacio de nombres 'urn: t3'. Cada parte del mensaje en un mensaje use = encoded debe especificar un tipo. // CODEGEN: se ignoró el enlace de operación 'transfer_domain' del espacio de nombres 'urn: t3'. Cada parte del mensaje en un mensaje use = encoded debe especificar un tipo. // CODEGEN: Se ignoró el enlace de la operación 'request_sendmail' desde el espacio de nombres 'urn: t3'. Cada parte del mensaje en un mensaje use = encoded debe especificar un tipo. // CODEGEN: se ignoró la operación de enlace 'inicio de sesión' desde el espacio de nombres 'urn: t3'. Cada parte del mensaje en un mensaje use = encoded debe especificar un tipo. // CODEGEN: se ignoró el enlace de la operación 'domain_registro' desde el espacio de nombres 'urna: t3'. Cada parte del mensaje en un mensaje use = encoded debe especificar un tipo. // CODEGEN: se ha ignorado la operación que vincula 'register_domain_with_admin_contacts' desde el espacio de nombres 'urn: t3'. Cada parte del mensaje en un mensaje use = encoded debe especificar un tipo. // CODEGEN: Se ignoró la operación que vincula 'renew_domain' del espacio de nombres 'urn: t3'. Cada parte del mensaje en un mensaje use = encoded debe especificar un tipo.
Editar:
probé este pedazo de código para mi clase codificado mano.
public String makeWebRequest(String methodName)
{
// Create the web request
HttpWebRequest request = WebRequest.Create("https://subreg.forpsi.com/robot2/subreg_command.php/") as HttpWebRequest;
// Add authentication to request
request.Credentials = new NetworkCredential("[email protected]", "bar");
request.Method = "POST";
request.ContentType = "text/xml";
request.Headers.Add("SOAPAction: https://subreg.forpsi.com/robot2/subreg_command.php/" + methodName);
// Get response
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
// Get the response stream
StreamReader reader = new StreamReader(response.GetResponseStream());
// Console application output
//Console.WriteLine(reader.ReadToEnd());
return reader.ReadToEnd();
}
}
Pero cuando trato de obtener una respuesta entonces se vuelve
The remote server returned an error: (500) Internal Server Error.
@Dan Muchas gracias por este fragmento de código. Realmente despejó mi pensamiento sobre el tema. Todo es bastante comprensible en su código. Pero no pude obtener/encontrar la función llamada * GetSoapString *.¿Podrías simplemente decir lo que hace para poder escribir uno propio o si ya está definido, entonces podrías darle implementación o .Net Namespace que concuerde con la definición para él? –
@Dan Probé tu código. Pero cuando trato de obtener una respuesta del servidor, recibo lo siguiente: * El servidor remoto devolvió un error: (500) Error interno del servidor. * ¿Es normal? En caso afirmativo, ¿qué debo hacer en mi código para procesar dicha respuesta? Antes de publicar mi problema en stackoverflow, intenté con otro código e intenté enviar una solicitud web, pero se devolvió el mismo error. ¿Significa que requiere alguna autorización o credenciales? ¿Veo claramente una función Login() allí? ¿El SSL está creando el problema? Si debo enviar credenciales al servicio web, ¿cómo enviarlas? –
@Dan * WebResponse webResponse = httpRequest.GetResponse(); * Esta es la línea donde se devuelve el error anterior. –