草庐IT

asp.net - Web.Config 转换 : Using Insert() to transform multiple elements

coder 2024-07-02 原文

使用 Visual Studio 2013 Premium。

目标:我在 web.config 中定义了多个 WCF 服务。为了保持 web.config 文件的可读性并简化添加服务的过程,我想使用 VS2013 的 XML 转换为我的开发/生产环境的每个服务定义添加一些样板元素。

问题:我有多个 <service>标签,但只有第一个被正确转换。

这是我的 Web.Config 的简化版本,其中定义了两个服务:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="AppName.AccountManagerService">
        <endpoint address="AccountManagerService" binding="netTcpBinding"
          bindingConfiguration="" contract="Shared.Contracts.IAccountManagerService" />
      </service>
      <service name="AppName.TicketManagerService">
        <endpoint address="TicketManagerService" binding="netTcpBinding"
          bindingConfiguration="" contract="Shared.Contracts.ITicketManagerService" />
      </service>
    </services>
</configuration>

我想创建一个元数据交换端点并对每个 <service> 做一些其他事情(未显示)标签。

这是一个简化的 Web.Debug.Config,仅显示 MetadataExchange 端点:

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.serviceModel>
    <services>
      <service xdt:Locator="XPath(/configuration/system.serviceModel/services/service)">
        <endpoint kind="mexEndpoint"
                  address="mex"
                  xdt:Transform="Insert()"
                />
      </service>
    </services>
  </system.serviceModel>
</configuration>

我明白了:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="AppName.AccountManagerService">
        <endpoint address="AccountManagerService" binding="netTcpBinding"
          bindingConfiguration="" contract="Shared.Contracts.IAccountManagerService" />

        <!-- Yay! -->
        <endpoint kind="mexEndpoint"
                  address="mex"
                />

      </service>
      <service name="AppName.TicketManagerService">
        <endpoint address="TicketManagerService" binding="netTcpBinding"
          bindingConfiguration="" contract="Shared.Contracts.ITicketManagerService" />

        <!-- Hey, where's the endpoint tag for this one? -->

      </service>
    </services>
</configuration>

我已经在 XPath 上尝试了这些变体xdt:Locator 中的参数的属性:

1. /configuration/system.serviceModel/services/service
2. /configuration/system.serviceModel/services//service
3. //service

所有这些都第一个<service>部分。

我试过将 xdt:Locator <endpoint> 上的属性标签等无济于事。

我有多个 XPath 可视化工具和工具,它们都匹配两者 <service>与上面的 XPath #1 一起使用时的标记。此外,此错误发生在“预览转换”和 Web 部署工具预览中。

我做错了什么?

(此时,我的解决方法是在我的原始 Web.Config 中包含 Mex 端点和其余调试问题,然后使用“RemoveAll()”将其删除,但这使我的 Web.Config 真的困惑且难以阅读。)

最佳答案

我最近遇到了这个问题,结果发现它不受支持。

我的工作是添加一个自定义转换,并使用它而不是插入。它们实现的问题是默认 Insert 仅修改第一个值(即使 XPath 表达式确实检索了一个列表)。

可在此处找到 XDT 源:http://xdt.codeplex.com/

我看到的文章让我走上了正确的方向:http://blog.appharbor.com/2012/07/27/custom-web-config-transforms-and-merges

我所做的是将一个新类添加到他们的源代码中,并且能够实现您正在寻找的东西。

internal class InsertMultiple : Transform
{
    public InsertMultiple()
    {
        //this is the line that allows it to apply the transform for all nodes 
        //that were located with your XPath expression.
        ApplyTransformToAllTargetNodes = true;
    }

    protected override void Apply()
    {
        CommonErrors.ExpectNoArguments(Log, TransformNameShort, ArgumentString);

        TargetNode.AppendChild(TransformNode);

        Log.LogMessage(MessageType.Verbose, SR.XMLTRANSFORMATION_TransformMessageInsert, TransformNode.Name);
    }
}

关于asp.net - Web.Config 转换 : Using Insert() to transform multiple elements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22182289/

有关asp.net - Web.Config 转换 : Using Insert() to transform multiple elements的更多相关文章

  1. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

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

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

  3. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  4. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  5. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  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-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  8. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  9. 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

  10. ruby-on-rails - 使用 ruby​​ 将多个实例变量转换为散列的更好方法? - 2

    我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。

随机推荐