我正在尝试使用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字符串类型相同?).当我尝试调用此服务时,我得到异常:
The message with Action ” cannot be processed at the receiver,due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements,e.g. Message,Transport,None).
解决方法
我有完全相同的问题. 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); } }