He escrito un pequeño servicio web sencillo de C#, alojado desde un EXE independiente a través de WCF. El código - algo simplificado - se ve así:¿Cómo consumir el servicio web no alojado en IIS, WCF y C# de Delphi 2007?
namespace VMProvisionEXE
{
class EXEWrapper
{
static void Main(string[] args)
{
WSHttpBinding myBinding = new WSHttpBinding();
myBinding.Security.Mode = SecurityMode.None;
Uri baseAddress = new Uri("http://bernard3:8000/VMWareProvisioning/Service");
ServiceHost selfHost = new ServiceHost(typeof(VMPService), baseAddress);
try
{
selfHost.AddServiceEndpoint(typeof(IVMProvisionCore), myBinding, "CoreServices");
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy12;
selfHost.Description.Behaviors.Add(smb);
// Add MEX endpoint
selfHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
selfHost.Open();
Console.WriteLine("The service is ready.");
Console.ReadLine();
El resto del código C#; la clase VMPService anterior implementa VMProvisionCore.IVMProvisionCore.
Puedo crear fácilmente una aplicación cliente Visual Studio 2008 que consuma este servicio. No hay problemas. Pero usar Delphi 2007 es un problema diferente. Puedo usar el importador WSDL en Delphi para recuperar el WSDL de (en este caso) http://bernard3:8000/VMWareProvisioning/Service?wsdl La unidad de importación se compila muy bien. Tengo para inicializar el proxy manualmente desde el WSDL no contiene una dirección URL (observe que el extra "/ CoreServices" como se muestra en el código C#):
var
Auth: AuthenticateUser;
AuthResponse: AuthenticateUserResponse;
CoreI: IVMProvisionCore;
begin
CoreI:= GetIVMProvisionCore(False, 'http://bernard3:8000/VMWareProvisioning/Service/CoreServices');
Auth:= AuthenticateUser.Create;
try
Auth.username:= 'test';
Auth.password:= 'test';
AuthResponse:= CoreI.AuthenticateUser(Auth);
finally
FreeAndNIL(Auth);
end;
El código anterior generará un error cuando se golpea el "CoreI.AuthenticateUser (Auth);". El error es "no puede procesar el mensaje porque el tipo de contenido 'text/xml; charset = "UTF-8" no era el esperado tipo' application/soap + xml;. Charset = UTF-8"
I sospecho que tengo un pequeño error estúpido en alguna parte, tal vez durante la importación del WSDL o en las opciones de conexión o algo así. ¿Alguien puede ayudar?
¿Sabes dónde puedo descargar los últimos WSDLImp.exe? Revisé el sitio web de Embarcadero, pero no pude encontrar nada más allá de las referencias a errores corregidos. –