我正在尝试使用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客户端来更改绑定或安全性参数。我该如何解决这个问题?
答案 0 :(得分: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);
}
}
答案 1 :(得分:2)
您需要查看客户端和服务之间的网络流量,以查看正在发生的情况。或者,在服务上启用WCF跟踪,可能包括消息跟踪。您应该能够非常详细地了解正在发生的事情。