草庐IT

关于 .net:自动别名生成的 SOAP 代理

codeneng 2023-03-28 原文

Auto-alias generated SOAP proxies

我目前正准备在 .NET 项目 (C#) 中使用 SOAP Web 服务,但是用于服务类型和操作的命名约定相当糟糕与命名约定不一致典型的 C# .NET 项目。

我的问题本质上是:有没有办法在我的客户端实现中自动为生成的 SOAP Web 服务代理类型/方法设置别名?

我希望有某种方法可以使用别名映射执行 WSDL 的转换,这样生成的(或重新生成的)类型使用诸如 Contact 之类的名称,但映射到底层的 contactObject 定义。

由于我不知道可以在生成过程中执行的任何转换,我目前正在手动(或至少在 T4 的帮助下)为类编写package器,但这似乎是不必要的级别间接;更不用说,一个痛苦的屁股。

我正在阅读 Svcutil 上的文档,但没有找到任何适用的标志。

  • 在我提出更复杂的答案之前,让我知道这个问题的答案是否有帮助。我之所以这么问,是因为 SOAP 服务中那些糟糕的名称似乎必须来自同一个来源,即自动生成的 DataContractFormat。您是否有权访问 SOAP 服务的程序集?如果可以只重写 Web 服务接口层并使用它的依赖项,那么您只需要 [XmlSerializerFormat] 属性。
  • @MarkBailey 我无权访问服务器端应用程序代码;它完全是第三方。糟糕的 SOAP 名称(我推测)可能是第三方命名约定的结果,可能源自他们使用的任何平台的约定(PHP、Java、*耸肩*)如果问题只是那个"字段"被附加到成员身上,我只是忍受它。
  • @MarkBailey 我刚刚找到了关于 Web Service Software Factory 的答案。也许类似的东西可以为我提供完成此任务所需的定制;我得读一读。不过,与此同时,我全神贯注于您的复杂答案;-)
  • 好吧,显然 Web 服务软件工厂不想安装,根据我正在阅读的内容,这似乎是一个"陷入困境"的情况......


我已将这个发布到你的另一个问题,但你是对的,它更适合这个问题:

我假设您通过使用"添加服务引用..."添加此第三方服务来使用它,它会为 Reference.cs 中的每个类自动生成一些代码,其签名可能看起来像像这样:

1
2
3
4
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace ="http://www.thirdpartyguys.net")]
public partial class qux: object, System.ComponentModel.INotifyPropertyChanged {

你希望它不是qux,而是Qux。如果到目前为止这一切都与您的模型相似,那么您只需将 qux 更改为 Qux,但将 TypeName="qux" 添加到 XmlTypeAttribute,并更改引用中对此类的所有引用。这在 SOAP 中维护了正确的 xml 模式,但是让您更改项目中的名称:

1
2
3
4
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace ="http://www.thirdpartyguys.net", TypeName ="qux")]
public partial class Qux: object, System.ComponentModel.INotifyPropertyChanged {

当然,如果该 XmlType 属性尚未在定义命名空间的类上,您可以添加它。它只是没有命名空间参数。我刚刚对此进行了测试,它确实允许我使用该服务,并且只需在我使用它的任何地方以不同的名称调用一个对象。

这对你有用吗?

编辑:(向未来的读者简要介绍 SchemaImporterExtension 的想法)
据我了解,当从 WSDL 添加服务引用时,此扩展类可以调用与默认代码生成行为的偏差。您最终仍然拥有一些 Reference.cs 作为您的项目和服务之间的链接,但您可以更改生成的内容。因此,如果我们希望对象始终以大写字母开头,例如,我认为这个想法是做这样的事情(未经测试):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class test : SchemaImporterExtension
{
    public override string ImportSchemaType(string name, string ns, XmlSchemaObject context,
        XmlSchemas schemas, XmlSchemaImporter importer, CodeCompileUnit compileUnit,
        CodeNamespace codeNamespace, CodeGenerationOptions options, CodeDomProvider codeGenerator)
    {
        if (name[0].CompareTo('a') >= 0) //tests if first letter is lowercase
        {
            CodeExpression typeNameValue = new CodePrimitiveExpression(name);
            CodeAttributeArgument typeNameParameter = new CodeAttributeArgument("TypeName", typeNameValue);
            CodeAttributeDeclaration xmlTypeAttribute = new CodeAttributeDeclaration("XmlTypeAttribute", typeNameParameter);
            compileUnit.AssemblyCustomAttributes.Add(xmlTypeAttribute);
            return name.Substring(0, 1).ToUpper() + name.Substring(1);
        }
        return null;
    }
}

理论上,这将写入 XmlType 属性并将名称更改为正确的大小写,从而在 SOAP 中保持正确的 XML 映射。理论上,使用 SchemaImporterExtension 的优点是对服务引用的更新不会覆盖更改。此外,可以进行一般更改,而不是针对每个特定参考。

欢迎成功使用 SchemaImporterExtension 的人发表评论或编辑。

  • 太棒了,谢谢@MarkBailey。正如我们在聊天中讨论的那样,我将看一下 SchemaImporterExtension 方法,否则会退回到 XmlTypeAttribute 重命名"所有事物";-)
  • 哇,关于 SchemaImporterExtension 的好例子。我仍在处理这个过程,但是当我回到我的机器并附加一个代码示例时,我将把它标记为答案。

有关关于 .net:自动别名生成的 SOAP 代理的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  3. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  4. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  5. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  6. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  7. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  8. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  9. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  10. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

随机推荐