gpt4 book ai didi

c# - WCF 服务引用命名空间与原始命名空间不同

转载 作者:可可西里 更新时间:2023-11-01 08:05:43 26 4
gpt4 key购买 nike

我在服务引用使用的命名空间方面遇到了问题。我有许多 WCF 服务,例如命名空间 MyCompany.Services.MyProduct(实际命名空间更长)。
作为产品的一部分,我还提供了一个示例 C# .NET 网站。此 Web 应用程序使用命名空间 MyCompany.MyProduct

在最初的开发过程中,该服务作为项目引用添加到网站并直接使用。我使用了一个工厂模式,它返回一个实现了 MyCompany.Services.MyProduct.IMyService 的对象实例。到目前为止,还不错。

现在我想将其更改为使用实际的服务引用。添加引用并在命名空间文本框中键入 MyCompany.Services.MyProduct 后,它会在命名空间 MyCompany.MyProduct.MyCompany.Services.MyProduct 中生成类。 不好!我不想仅仅因为我正在使用代理类就必须在多个地方更改 using 指令。所以我尝试在命名空间前添加 global::,但不被接受。

请注意,我什至还没有删除原始程序集引用,并且启用了“重用类型”,但显然没有进行重用。 但是,我不想在示例网站中保留程序集引用以使其正常工作

到目前为止,我想出的唯一解决方案是将我的 Web 应用程序的默认命名空间设置为 MyCompany(因为它不能为空),并将服务引用添加为 Services .我的产品。假设客户想要使用我的示例网站作为起点,并且他们将默认命名空间更改为 OtherCompany.Whatever,这显然会破坏我的解决方法。

这个问题有好的解决办法吗?

总结:我想在原始命名空间中生成服务引用代理,而不引用程序集。

注:我看过this question ,但没有提供适合我的用例的解决方案。


编辑:正如 John Saunders 所建议的,我已经向 Microsoft 提交了一些关于此的反馈:
Feedback item @ Microsoft Connect

最佳答案

我添加了一个 write-up of this solution到我的博客。确实是相同的信息,但可能不那么分散

我找到了使用 svcutil.exe 的替代方法完成我想要的。它 (imo) 使更新服务引用比重新运行实用程序更容易。

您应该在您的 ServiceContract 和 DataContracts 上明确指定命名空间 uri(请参阅下面的注释)。

[ServiceContract(Namespace = "http://company.com/MyCompany.Services.MyProduct")]
public interface IService
{
[OperationContract]
CompositeType GetData();
}

[DataContract(Namespace = "http://company.com/MyCompany.Services.MyProduct")]
public class CompositeType
{
// Whatever
}

命名空间可以是任何东西,但从技术上讲它需要是一个有效的 uri,所以我选择了这个方案。您可能必须手动构建才能让事情在以后工作,所以就这样做吧。

完成此操作后,在解决方案资源管理器中启用显示所有文件 选项。展开您之前添加的服务引用。双击 Reference.svcmap文件。

会有一个<NamespaceMappings />元素,您将需要对其进行编辑。继续我的例子:

<NamespaceMappings>
<NamespaceMapping
TargetNamespace="http://company.com/MyCompany.Services.MyProduct"
ClrNamespace="MyCompany.Services.MyProduct" />
</NamespaceMappings>

保存文件,右键单击服务引用并选择更新服务引用

您可以根据需要添加任意数量的映射(实际上我需要两个)。效果与svcutil /namespace:相同方法,但不必使用命令行工具本身,从而更容易更新。

与svcutil的区别

这种方法的缺点是您需要使用显式命名空间映射。使用 svcutil ,您可以选择像这样映射所有未明确映射的内容(John Saunders 所指的解决方案):

svcutil /namespace:*,MyCompany.Services.MyProduct ...

您可能会考虑使用:

<NamespaceMappings>
<NamespaceMapping
TargetNamespace="*"
ClrNamespace="MyCompany.Services.MyProduct" />
</NamespaceMappings>

但这将起作用,因为 Visual Studio 已经隐式添加了此映射,指向我们试图摆脱的生成的命名空间名称。上述配置将导致 Visual Studio 提示重复键。

广告显式命名空间:
如果您的代码中未指定显式命名空间,似乎 .NET 将生成 http://schemas.datacontract.org/2004/07/MyCompany.Services.MyProduct 形式的 uri。 。在我的示例中,您可以将其映射为显式命名空间,但我不知道是否可以保证这种行为。因此,使用显式命名空间可能会更好。

注意:将两个 TargetNamespace 映射到同一个 ClrNamespace 似乎会中断代码生成

关于c# - WCF 服务引用命名空间与原始命名空间不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1200346/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com