Ich habe einen ziemlich einfachen kleinen C# -Webdienst geschrieben, der von einer eigenständigen EXE über WCF gehostet wird. Der Code - etwas vereinfacht - sieht wie folgt aus:Wie kann ich einen nicht von IIS gehosteten WCF-, C# -Webdienst von Delphi 2007 verwenden?
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();
Der Rest des C# -Code; Die obige Klasse VMPService implementiert VMProvisionCore.IVMProvisionCore.
Ich kann problemlos eine Visual Studio 2008-Clientanwendung erstellen, die diesen Dienst verwendet. Keine Probleme. Die Verwendung von Delphi 2007 ist jedoch ein anderes Problem. Ich kann das WSDL-Importer in Delphi verwenden, um die WSDL von (in diesem Fall) http://bernard3:8000/VMWareProvisioning/Service?wsdl abzurufen. Die Importeinheit kompiliert einfach gut. Ich habe den Proxy von Hand zu initialisieren, da die WSDL keine URL enthält (beachten Sie die extra „/ Coreservices“, wie in der C# -Code dargestellt):
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;
Der obige Code wird einen Fehler erzeugen, wenn er trifft der "CoreI.AuthenticateUser (Auth);". Der Fehler ist "Kann die Nachricht nicht verarbeiten, da der Inhaltstyp 'text/xml; charset = "UTF-8" war nicht der erwartete Typ' application/soap + xml;. Charset = utf-8"
I vermute, dass ich irgendwo einen dummen kleinen Fehler habe, vielleicht beim Import der WSDL oder in den Verbindungsoptionen oder sowas. Kann jemand helfen?
Wissen Sie, wo ich die neuesten WSDLImp.exe herunterladen kann? Ich habe die Embarcadero-Website überprüft, konnte jedoch nichts finden, das über Bugfix-Referenzen hinausgeht. –