2009-07-07 6 views
3

J'essaye de faire un client Delphi (Delphi 2006) pour communiquer avec un service écrit en utilisant WCF. Le service est sacrément simple avec une seule fonction. Techniquement comme ci-dessous:Problème lors de la consommation du service WCF (basicHttpBinding) dans Delphi Win32 Client

[ServiceContract (Namespace = "http://www.company.com/sample/")] 
public interface IService 
{ 
    [OperationContract] 
    string GetNumber (string name); 
} 

J'ai hébergé ce service sur IIS et exposé à l'aide basicHttpBinding au point final MEX. Je suis capable de l'utiliser dans les clients .NET.

J'ai essayé d'exécuter WSDLImp.exe et il a généré une unité de code source (btw, il génère des classes wierd pour encapsuler le type de chaîne, pourquoi ne peut-il être identique au type de chaîne Delphi?). Lorsque j'essaie d'appeler ce service, j'obtiens l'exception:

Le message avec Action '' ne peut pas être traité sur le récepteur, en raison d'une incompatibilité ContractFilter sur EndpointDispatcher. Cela peut être dû soit à une non-concordance de contrat (Actions non concordantes entre l'expéditeur et le destinataire), soit à une non-concordance de liaison/sécurité entre l'expéditeur et le destinataire. Vérifiez que l'expéditeur et le destinataire ont le même contrat et la même liaison (y compris les exigences de sécurité, par exemple Message, Transport, Aucune).

Je ne vois aucun moyen de configurer le client Delphi Win32 pour modifier les paramètres de liaison ou de sécurité. Comment puis-je résoudre ce problème?

Répondre

3

J'ai eu exactement le même problème. Delphi a juste du mal à importer le WSDL exposé par WCF. Une solution consiste à ajouter un wrapper ASMX à votre service et à l'utiliser avec les clients Delphi.

Voici un exemple:

[ServiceContract (Namespace = "http://www.company.com/sample/")] 
public interface IService 
{ 
    [OperationContract] 
    string GetNumber (string name); 
} 

public class Service : IService 
{ 
    public string GetNumber (string name) 
    { 
     return Repository.GetNumber(name); 
    } 
} 

[WebService(
    Namespace = "http://www.company.com/sample/", 
    Name = "wstest", 
    Description = "description")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class AsmxService : WebService 
{ 
    [WebMethod] 
    public string GetNumber(string name) 
    { 
     return Repository.GetNumber(name); 
    } 
} 
+0

Désolé mais je ne comprends pas ce que vous voulez dire par "ajouter un wrapper ASMX". S'il vous plaît pouvez-vous élaborer? – Hemant

+0

Par "ajouter un wrapper ASMX" je veux dire que vous pouvez ajouter un service web ASMX à votre solution qui a les mêmes méthodes que votre service WCF et ces méthodes effectuent exactement les mêmes tâches. Une fois que vous avez ajouté ce service Web asmx, vous obtenez un point de terminaison .asmx qui pourrait être utilisé par les clients Delphi. –

+0

Je ne sauterais plus à ASMX: http://johnwsaundersiii.spaces.live.com/blog/cns!600A2BE4A82EA0A6!860.entry. –

2

Vous devez regarder le trafic réseau entre le client et le service pour voir ce qui se passe. Vous pouvez également activer le suivi WCF sur le service, éventuellement en incluant le suivi des messages. Vous devriez être capable de voir ce qui se passe, dans les moindres détails.

+0

Ceci est une réponse et une opinion! +1 – Sam