【问题标题】:How can I set a namespace without overwriting the service configuration name using SvcUtil.exe?如何在不使用 SvcUtil.exe 覆盖服务配置名称的情况下设置命名空间?
【发布时间】:2013-09-03 22:08:58
【问题描述】:

我正在使用 SvcUtil.exe 生成我的 WCF 代码,如下所示:

SvcUtil.exe http://www.MyServer.com:8080/MyService/mex /out:"C:\test.cs" /mc

我可以让它工作,但是如果我设置添加一个/namespace 参数(/namespace:*,MyNamespace),它会覆盖生成接口的生成ServiceContractAttribute 上的ConfigurationName 值:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(ConfigurationName="MyNamespace.MyServiceName")]
public interface MyServiceName
{ ... }

如果我不设置命名空间,ConfigurationName的值为“MyServiceName”,正确(“MyNamespace.MyServiceName”不正确,不起作用)。我尝试添加 /ServiceName:MyService 参数,但它告诉我它说

错误:/serviceName: 选项 与其他选项冲突。审查 您对工具的使用。

如何在不覆盖 ConfigurationName 的情况下为生成的类指定命名空间?

【问题讨论】:

    标签: wcf svcutil.exe generated-code


    【解决方案1】:

    我也有同样的问题。我有一个 ServiceReference,它的 ConfigurationName="MyWebService.MyWebServiceSoap" 在通过 VisualStudio.NET 2010 添加时生成。当我使用 svcutil 从 msbuild 生成相同的类时,svcutil 希望将 ConfigurationName 设置为等于我设置的值对于命名空间。因此,如果我像这样设置 /n 属性:

    /n:*,MyApplication.MyWebService.MyWebServiceSoap
    

    我为生成的类获得了正确的命名空间,但 ConfigurationName 也设置为 MyApplication.MyWebService.MyWebServiceSoap。

    这似乎表明VS.NET没有使用svcutil,我发现有posts似乎也表明了这一点。

    我希望我有一个更好的答案,但由于我使用的是 MSBuild 中的 svcutil,我的解决方案是让 svcutil 生成具有不正确 ConfigurationName 的类,然后使用 FileUpdate 任务使用正则表达式修改该名称。同样,它远非理想,但我在 svcutil 文档中看不到任何可让您指定 ConfigurationName 的内容。

    另外,值得一提的是 serviceName 选项用于从编译的代码中导出元数据,它对生成客户端代理类无效,这可能是您收到 serviceName 选项冲突错误的原因。

    见:http://msdn.microsoft.com/en-us/library/aa347733.aspx

    【讨论】:

      【解决方案2】:

      不是问题的直接答案,但命名空间更改对您不起作用的原因可能是您忘记更新对该服务的配置合同引用。

      在您的应用程序/网络配置中,查找

       <client>
          <endpoint .. contract="MyServiceName">
          </endpoint>
       </client>
      

      查看contract 属性。当您没有在 svcutil 中指定命名空间时,它会生成 MyServiceName,而在 web.config 中,您仅使用接口名称引用了您的服务名称。现在,您的界面位于命名空间内,因此您需要将配置更改为:

       <client>
          <endpoint .. contract="MyNamespace.MyServiceName">
          </endpoint>
       </client>
      

      简而言之,属性中的ConfigurationName 属性必须与config 文件的contract 属性中的命名空间和类名相匹配。它是一个,通过它可以找到匹配的配置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-14
        • 2018-09-13
        • 2016-06-02
        • 1970-01-01
        • 2012-07-19
        相关资源
        最近更新 更多