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

动态C#.NETWeb服务分享

时间:2023-04-10 17:34:51 C#

动态C#.NETWeb服务换句话说,脚本应该能够公开具有任何签名的任何名称的任何方法(只要它可以通过这个SOAP接口对外界可用(能够随意添加和删除它们而无需硬代码更改),所以我需要能够在C#中创建Web服务类,同时能够在运行时动态添加和删除方法。现在,到目前为止,我能想到的最佳计划是生成(在运行时)C#代码来表示Web服务,使用System.Reflection.Emit对其进行编译,然后在运行时加载程序集-所有这些脚本都在服务中添加或删除方法(请注意,不应该经常发生)。有没有人有更好的主意这?您可以使用SoapExtensionReflector类来修改WSDL。来自KirkEvans博客:当您的类型被反映以提供服务的WSDL定义时,将调用SoapExtensionReflector。您可以使用此类型拦截反射调用并修改WSDL输出。以下示例从2个Web服务方法中删除第一个方法:[WebService(Namespace="http://tempuri.org/")][WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)][System.ComponentModel.ToolboxItem(false)]publicclassService1:System.Web.Services.WebService{[WebMethod]publicstringHelloWorld(){return"HelloWorld";}[WebMethod]publicintMultiply(inta,intb){returna*b;}}创建一个继承自SoapExtensionReflector的类:如果(description.PortTypes[0].Operations.Count==2)description.PortTypes[0].Operations.RemoveAt(0);如果(description.Messages.Count==4){description.Messages.RemoveAt(0);描述.Messages.RemoveAt(0);}foreach(Bindingbindingindescription.Bindings){if(binding.Operations.Count==2)binding.O操作.RemoveAt(0);}if(description.Types.Schemas[0].Items.Count==4){description.Types.Schemas[0].Items.RemoveAt(0);description.Types.Schemas[0].Items.RemoveAt(0);}}}}将此添加到web.config中的configuration/system.web部分:这应该为您提供一个从WSDL文档动态删除方法的起点如果禁用,您还需要从web中删除方法方法抛出未实现异常。最后,您需要通过调用.asmx端点而不使用?WSDL参数生成Web服务文件。将wsdlHelpGenerator元素的href属性设置为URL。您可以使用DefaultWsdlHelpGenerator.aspx作为您自己的文档处理程序的起点。请参阅2002年8月发行的关于Web服务文档的XML文档。XMLRPC已经死了,不是吗?SOAP表示WSDL。如何动态生成WSDL?您应该考虑使用WCF。我希望您能够控制生成WSDL(和其他元数据)的过程,但您还应该能够控制传入消息的处理。特别是,您将能够检查传入消息以确定要运行哪个脚本、要传递哪些参数等。您可以创建一个输入和输出类型为xs:any的WCF服务,并将传入请求作为原始消息获取。这将允许您接受任何类型的数据并返回任何类型的数据。您不会使用数据契约或静态类型,只需使用消息输入和消息输出。这种方法的问题是从WSDL生成代理实际上并不能帮助消费者,除了提供一个包装器来调用该方法。提供该方法可接受的数据需要手动滚动数据类型等,这并不困难,它不像硬类型合同那样直观。它必须是SOAP接口吗?听起来它可能更适合基于路由/REST/等的API。您可以在ASP.NETMVC中做一些事情(使用自定义IController.Execute方法来解析对该方法的操作)非常容易(事实上,我正在处理与我自己的代码非常相似的事情)。例如,您可能有一个路由:http://myserver/myservice/mymethod接受(在正文或args中)有效负载(参数),并在响应中返回结果。在非MVC中,您应该能够使用通配符映射的通用处理程序执行类似的操作。这是一个建议:以上就是《C#学习教程:动态C#.NETWeb服务》的全部内容。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: