如何在不使用SvcUtil.exe覆盖服务配置名称的情况下设置命名空间?

时间:2011-01-02 19:29:08

标签: wcf svcutil.exe generated-code

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

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

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

[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的情况下为生成的类指定命名空间?

2 个答案:

答案 0 :(得分:8)

我遇到了同样的问题。我有一个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

答案 1 :(得分:2)

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

在您的app / web配置中,查找

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

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

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

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