代码之家  ›  专栏  ›  技术社区  ›  Hemant

在Delphi Win32客户端中使用WCF服务(basicHttpBinding)时出现问题

  •  3
  • Hemant  · 技术社区  · 15 年前

    我正在尝试制作一个Delphi客户端(Delphi2006),以便与使用WCF编写的服务进行通信。服务非常简单,只有一个功能。技术上如下:

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

    我在IIS上托管了此服务,并使用basicHttpBinding和mex端点将其公开。我可以在.NET客户端中使用它。

    我试着运行WSDLImp.exe,它生成了一个源代码单元(顺便说一句,它生成wierd类来封装字符串类型。为什么它不能与Delphi字符串类型相同?)。当我尝试调用此服务时,出现异常:

    由于EndpointDispatcher上的ContractFilter不匹配,无法在接收器上处理具有操作“”的消息。这可能是因为合同不匹配(发送方和接收方之间的操作不匹配)或发送方和接收方之间的绑定/安全不匹配。检查发送方和接收方是否具有相同的合同和相同的绑定(包括安全要求,例如消息、传输、无)。

    我看不到任何方法可以配置Delphi Win32客户端来更改绑定或安全参数。我如何解决这个问题?

    2 回复  |  直到 13 年前
        1
  •  3
  •   Darin Dimitrov    15 年前

    我也有同样的问题。Delphi很难导入WCF公开的WSDL。一种解决方案是将ASMX包装器添加到您的服务中,并将其用于Delphi客户端。

    下面是一个例子:

    [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);
        }
    }
    
        2
  •  2
  •   John Saunders Andrey Morozov    15 年前

    您需要查看客户端和服务之间的网络流量,以了解发生了什么。或者,在服务上启用WCF跟踪,可能包括消息跟踪。你应该能够看到发生了什么,非常详细。

    推荐文章