3

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

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

我已在 IIS 上托管此服务,并使用带有 mex 端点的 basicHttpBinding 公开它。我可以在 .NET 客户端中使用它。

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

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

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

4

2 回答 2

3

我遇到了完全相同的问题。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);
    }
}
于 2009-07-07T06:06:51.647 回答
2

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

于 2009-07-09T00:54:48.753 回答