【问题标题】:Is there a way to call 'Update Service Reference' without it changing the App.Config?有没有办法在不更改 App.Config 的情况下调用“更新服务参考”?
【发布时间】:2011-12-26 10:42:44
【问题描述】:

好的,我管理自己的 App.Config。我不需要向导为我做这件事,非常感谢。它放在我的 App.Config 中的代码是冗长的垃圾。我能够编写自己的 WCF 端点和绑定。我只想让 Visual Studio 2010 做它最擅长的事情:代码生成。只需给我服务器和数据合同代码!有什么办法可以关闭它吗?有没有办法在不更改 App.Config 的情况下调用“更新服务参考”?它非常令人沮丧。现在它给了我一个例外,除非我从我的 App.Config 中完全删除所有端点节点。

这是我得到的例外:

下载时出错 'http://localhost:8732/MyService/mex'。

请求失败,HTTP 状态 400:错误请求。

一个名为“endpoint”的子元素已经存在于 相同的配置范围。集合元素必须是唯一的 相同的配置范围(例如相同的 application.config 文件)。 重复键值: 'contractType:Web.DataService.MyService.IMyService;name:MyService.Live'。 (C:\ProjectPath\App.config 第 152 行)

这是我的 App.Config:

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="Binding.Debug" maxReceivedMessageSize="2147483647">
            </binding>
            <binding name="Binding.Secure" maxReceivedMessageSize="2147483647">
                <security mode="Transport">
                    <transport clientCredentialType="None"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <!-- Debug client endpoints -->

        <endpoint name="MyService.Debug"
                  contract="Web.DataService.MyService.IMyService" 
                  address="http://localhost:8732/MyService"
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding.Debug"
                  />
        <endpoint name="MyService1.Debug"
                  contract="Web.DataService.MyService1.IMyService1" 
                  address="http://localhost:8732/MyService1"
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding.Debug"
                  />
        <endpoint name="MyService2.Debug"
                  contract="Web.DataService.MyService2.IMyService2"
                  address="http://localhost:8732/MyService2"
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding.Debug"
                  />
        <endpoint name="MyService3.Debug"
                  contract="Web.DataService.MyService3.IMyService3"
                  address="http://localhost:8732/MyService3"
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding.Debug"
                  />

        <!-- Local client endpoints -->

        <endpoint name="MyService.Local"
                  contract="Web.DataService.MyService.IMyService" 
                  address="https://www.mydomain.com/MyVirtualDirectory.Local/MyService.svc"
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding.Secure"
                  />
        <endpoint name="MyService1.Local"
                  contract="Web.DataService.MyService1.IMyService1" 
                  address="https://www.mydomain.com/MyVirtualDirectory.Local/MyService1.svc"
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding.Secure"
                  />
        <endpoint name="MyService2.Local"
                  contract="Web.DataService.MyService2.IMyService2"
                  address="https://www.mydomain.com/MyVirtualDirectory.Local/MyService2.svc"
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding.Secure"
                  />
        <endpoint name="MyService3.Local"
                  contract="Web.DataService.MyService3.IMyService3"
                  address="https://www.mydomain.com/MyVirtualDirectory.Local/MyService3.svc"
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding.Secure"
                  />

        <!-- Beta client endpoints -->

        <endpoint name="MyService.Beta"
                  contract="Web.DataService.MyService.IMyService"
                  address="https://www.mydomain.com/MyVirtualDirectory.Beta/MyService.svc"
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding.Secure"
                  />
        <endpoint name="MyService1.Beta"
                  contract="Web.DataService.MyService1.IMyService1"
                  address="https://www.mydomain.com/MyVirtualDirectory.Beta/MyService1.svc"
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding.Secure"
                  />
        <endpoint name="MyService2.Beta"
                  contract="Web.DataService.MyService2.IMyService2"
                  address="https://www.mydomain.com/MyVirtualDirectory.Beta/MyService2.svc"
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding.Secure"
                  />
        <endpoint name="MyService3.Beta"
                  contract="Web.DataService.MyService3.IMyService3"
                  address="https://www.mydomain.com/MyVirtualDirectory.Beta/MyService3.svc"
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding.Secure"
                  />

        <!-- Live client endpoints -->

        <endpoint name="MyService.Live"
                  contract="Web.DataService.MyService.IMyService"
                  address="https://www.mydomain.com/MyVirtualDirectory/MyService.svc"
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding.Secure"
                  />
        <endpoint name="MyService1.Live"
                  contract="Web.DataService.MyService1.IMyService1"
                  address="https://www.mydomain.com/MyVirtualDirectory/MyService1.svc"
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding.Secure"
                  />
        <endpoint name="MyService2.Live"
                  contract="Web.DataService.MyService2.IMyService2"
                  address="https://www.mydomain.com/MyVirtualDirectory/MyService2.svc"
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding.Secure"
                  />
        <endpoint name="MyService3.Live"
                  contract="Web.DataService.MyService3.IMyService3"
                  address="https://www.mydomain.com/MyVirtualDirectory/MyService3.svc"
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding.Secure"
                  />
    </client>
</system.serviceModel>

这很令人沮丧!

编辑:

我已经弄清楚了我遇到的异常。我有两次 MyService2.Live。我解决了这个问题,不再出现异常。我仍然想知道是否可以阻止 VS10 更改我的 App.Config。

【问题讨论】:

    标签: wcf visual-studio-2010 app-config


    【解决方案1】:

    您可以使用svcutil 工具生成文件并手动将它们与您修改过的文件合并。

    p.s:如果您的客户是 Silverlight,请使用 slsvcutil

    【讨论】:

    • 我知道。我也可以编写自己的代理类。但我宁愿只使用 VS10 更新 Web 服务。
    • 我不是在告诉您编写自己的代理类,我只是说使用与 Visual Studio 相同的生成器,但您决定将生成的代码合并到文件中的内容。
    • 不,我知道。你说的对。我只是懒惰。也许我可以找到一种方法来自动化它。我的客户让我做很多构建和修复工作,所以我必须每天更新(生成的)代理四到五次。
    【解决方案2】:

    我的问题解决方案(“更新服务参考”需要 2 秒......手动复制粘贴的 svcutil 需要 30 秒,并且 alt-tabs 太多):

    • 如果您使用源代码控制(例如 TFS)...在更新前检查应用程序或 web.config。然后运行“更新服务参考”。这将自动检查配置文件。更新后,只需从源代码管理中“撤消签出”即可将原始代码放回原处,但生成的参考代码将被更新。
    • 如果不在源代码管理中:打开应用程序或 web.config 文件,选择所有文本 (ctrl+a),复制 (ctrl+c),更新服务引用,再次选择配置文件中的所有文本 (ctrl+a ),粘贴 (ctrl+v)。

    与使用 svcutil 相比,这需要多几秒钟的时间,但风险仍然较小,老实说,我只在 IDE 中添加服务失败并且我需要一些对话框不会给我的信息时才使用它。

    旁注:如果您要添加服务,您当然应该为您的新服务手动添加正确的绑定和端点。

    【讨论】:

    • 更简单的解决方案是在 Visual Studio 中打开 App.Config 文件,然后切换到该文件并每次按 Ctrl+Z 将其返回。有用。我一直在寻找一个更自动化的解决方案(即不完全重写它。:)
    猜你喜欢
    • 1970-01-01
    • 2014-09-08
    • 2010-12-22
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多