当前位置: 首页 > 编程语言 > C#

如何在Delphi2007中使用非IIS托管、WCF、C#Web服务?Share

时间:2023-04-11 03:10:52 C#

如何在Delphi2007中使用非IIS托管、WCF、C#web服务?我编写了一个相当简单的小型C#Web服务,通过WCF从独立的EXE托管。代码-稍微简化-看起来像这样:myBinding.Security.Mode=SecurityMode.None;UribaseAddress=newUri("http://bernard3:8000/VMWareProvisioning/Service");ServiceHostselfHost=newServiceHost(typeof(VMPService),baseAddress);尝试{selfHost.AddServiceEndpoint(typeof(IVMProvisionCore),myBinding,"CoreServices");ServiceMetadataBehaviorsmb=newServiceMetadataBehavior();smb.HttpGetEnabled=true;smb.MetadataExporter.PolicyVersion=PolicyVersion.Policy12;selfHost.Description.Behaviors.Add(smb);//添加MEX端点selfHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,MetadataExchangeBindings.CreateBindings(,"mex");selfHost.Open();Console.WriteLine("Theserviceisready.");Console.ReadLine();RestofC#代码;上面的VMPService类实现了VMProvisionCore.IVMProvisionCore。命名空间VMProvisionCore{[ServiceContract(Namespace="http://Cisco.VMProvision.Core",ProtectionLevel=System.Net.Security.ProtectionLevel.None)]publicinterfaceIVMProvisionCore{[OperationContract]boolAuthenticateUser(stringusername,stringpassword);我可以轻松地创建一个使用此服务的VisualStudio2008客户端应用程序。没问题。但是使用Delphi2007是一个不同的问题。我可以使用Delphi中的WSDL导入器从(在本例中)http://bernard3:8000/VMWareProvisioning/Service检索WSDL吗?wsdl导入单元编译得很好。我必须手动初始化代理,因为WSDL不包含URL(请注意C#代码中显示的额外“/CoreServices”):varAuth:AuthenticateUser;AuthResponse:验证用户响应;CoreI:IVMProvisionCore;beginCoreI:=GetIVMProvisionCore(False,'http://bernard3:8000/VMWareProvisioning/Service/CoreServices');Auth:=AuthenticateUser.Create;试试Auth.username:='test';Auth.password:='测试';AuthResponse:=CoreI.AuthenticateUser(Auth);最后FreeAndNIL(Auth);结尾;上面的代码在遇到“CoreI.AuthenticateUser(Auth);”时会产生错误。错误是“无法处理消息,因为内容类型‘text/xml;charset="utf-8”不是预期的类型‘application/soap+xml;charset=utf-8。”我怀疑我在某个地方犯了一个愚蠢的小错误,可能是在导入WSDL或连接选项或其他东西时。有人可以帮忙吗?找到了解决方案。它由多个部分组成,需要在C#端进行一些更改,在Delphi端进行更多更改。请注意,这是使用Delphi2007和VisualStudio2008进行测试的。C#端:使用BasicHttpBinding而不是WSHttpBinding。修复步骤1BasicHttpBindingmyBinding=newBasicHttpBinding();myBinding.Security.Mode=BasicHttpSecurityMode.None;此更改将解决Delphi端的application/soap+xml错误。Delphi2007方面:针对修改后的C#Web服务运行现在会产生如下错误:由于EndpointDispatcher上的ContractFilter不匹配,无法在接收方处理带有消息“MessagewithAction”的异常类ERemotableException。这可能是由于合同不匹配(发送方和接收方之间的操作不匹配)或发送方和接收方之间的绑定/安全不匹配。检查发送方和接收方是否具有相同的合同和相同的绑定(包括消息、传输、无等安全要求)。要解决此问题,请将SOAPActions添加到所有受支持的接口。这是我的代码中的一个例子;这必须在import-from-WSDL-PAS-file的初始化部分中进行所有InvRegistry更改之后完成:修复步骤2InvRegistry.RegisterDefaultSOAPAction(TypeInfo(IVMProvisionCore),'http://Cisco.VMProvision.Core/CoreServices/%操作名称%');类型名称和URL应该可以从Delphi生成的WSDL导入文件和/或实际WSDL的检查中获得。上面的例子是我自己的项目。更改这些代码后,您将收到错误:ExceptionclassERemotableException'formatterwithmessagethrowexceptionwhiletryingtodeserializemessage:Errordeserializingrequestmessageliteralforoperation....通过添加以下代码解决此问题www.bobswart.nl/weblog/Blog.aspx?RootId=5:798)。同样,这个新代码必须在WSDL-to-PAS文件初始化之后的所有InvRegistry之后。修复步骤3InvRegistry.RegisterInvokeOptions(TypeInfo(IVMProvisionCore),ioDocument);此时,数据包将在Delphi和C#之间来回传递——但参数将不起作用。C#将接收所有参数作为空值,Delphi似乎没有正确接收响应参数。最后的代码步骤是使用允许文字参数的稍微自定义的THTPRIO对象。这部分的技巧是确保在获取界面后应用该选项;以前这样做是行不通的。这是我示例中的代码(只是片段)。修复第4步varR:THTTPRIO;C:IVMProvision核心;开始R:=THTTPRIO.Create(NIL);C:=GetIVMProvisionCore(False,TheURL,R);R.Converter.Options:=R.Converter.Options+[soLiteralParams];现在-我的Delphi2007应用程序可以与C#、独立、非IIS、WCFWeb服务通信!这是由SOAP版本不匹配引起的。C#服务需要SOAP12消息并从您的Delphi应用程序接收SOAP11消息。根据您的情况,您需要更改两侧中的任何一侧。我不能在德尔福方面发表评论。在WCF端,您可以使用默认为SOAP11的BasicHttpBinding,或者,如果您需要更多控制,可以使用为SOAP11指定消息类型的CustomBinding。在delphi中使用C#web服务时,我遇到了同样的问题。Delphi7.0/2005/2007不支持新的WSDL定义。为此,您需要下载最新的WSDLImporter(WSDLImp.exe)。它还将提供更新的delphi源代码传递文件的源代码。谢谢-这很有帮助。我有几条皱纹。对我来说,问题#2(SOAPAction)完全搞砸了,因为OperationName不匹配。.Net团队标准化将“In”放在SOAPAction的末尾,而不是在Operation中。所以yadda.yadda.com/whatever/services/%operationName%确实需要是yadda.yadda.com/whatever/services/%operationName%在这种特定情况下。我花了很长时间才发现这一点,但我最终注意到与SoapUI并行测试时,它具有与错误响应中返回的SOAPAction不同的SOAPAction。我解决了这个问题并且它有效。但这是在努力找出DefaultSOAPAction应该在哪里之后。同样,SoapUI在这里很有用。所以无论如何,如果您发现出现此错误:“由于EndpointDispatcher上的ContractFilter不匹配,无法在接收方处处理操作(无论如何)...”第一步是填充DefaultSOAPAction,如果问题仍然存在,请比较报告在bug中应该存在的与真正应该存在的相对。HTH,Chris以上是C#学习教程:Howtousenon-IIShosting,WCF,C#webservicesinDelphi2007?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: