Ho scritto un servizio web C# piuttosto semplice, ospitato da un file EXE autonomo tramite WCF. Il codice, in qualche modo semplificato, è il seguente:Come utilizzare Web service ospitato non IIS, WCF, C# da 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();
Il resto del codice C#; la classe VMPService sopra implementa VMProvisionCore.IVMProvisionCore.
posso facilmente creare un'applicazione client di Visual Studio 2008 che consuma questo servizio. Nessun problema. Ma usare Delphi 2007 è un problema diverso. Posso utilizzare l'importatore WSDL in Delphi per recuperare il WSDL da (in questo caso) http://bernard3:8000/VMWareProvisioning/Service?wsdl L'unità di importazione viene compilata correttamente. Devo inizializzare la delega a mano dal momento che il WSDL non contiene un URL (notare le extra "/ CoreServices" come mostrato nel codice 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;
Il codice precedente genera un errore quando colpisce il "CoreI.AuthenticateUser (Auth);". L'errore è "non può elaborare il messaggio in quanto il tipo di contenuto 'text/xml; charset = "utf-8" non era il tipo previsto' application/soap + xml;. Charset = utf-8"
I sospetto di aver avuto uno stupido piccolo errore da qualche parte, forse durante l'importazione del WSDL o nelle opzioni di connessione o qualcosa del genere. Qualcuno può aiutare?
Sai dove posso scaricare i latest WSDLImp.exe? Ho controllato il sito Web di Embarcadero, ma non sono riuscito a trovare nulla al di là dei riferimenti alla correzione degli errori. –