当前位置: 首页 > 编程语言 > C#

WCF服务引用命名空间与原始名称共享

时间:2023-04-10 18:59:04 C#

WCF服务引用命名空间与原始名称不同我的服务引用使用的命名空间有问题。我有很多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.MyProduct。假设客户想使用我的示例站点作为起点,他们将默认命名空间更改为OtherCompany.Whatever,这显然打破了我的解决方法。这个问题有好的解决方案吗?总结一下:我想在原始命名空间中生成一个服务引用代理,而不引用程序集。注意:我看过这个问题,但它没有提供适用于我的用例的解决方案。编辑:正如JohnSaunders所建议的,我已经向Microsoft提交了一些反馈:FeedbackProject@MicrosoftConnect我已经在我的博客中添加了一篇关于此解决方案的文章。确实是相同的消息,但可能不那么零散我找到了使用svcutil.exe来完成我想要的东西的替代方法。它(imo)使更新服务引用比重新运行该实用程序更容易。您应该在ServiceContract和DataContracts上明确指定名称空间uri(请参阅下面的注释)。[ServiceContract(Namespace="http://company.com/MyCompany.Services.MyProduct")]publicinterfaceIService{[OperationContract]CompositeTypeGetData();}[DataContract(Namespace="http://company.com/MyCompany.Services.MyProduct")]publicclassCompositeType{//Whatever}命名空间可以是任何东西,但从技术上讲它需要是一个有效的uri,所以我选择了这个选项。您可能需要手动构建才能稍后工作,所以这样做。完成后,在解决方案资源管理器中启用显示所有文件选项。展开先前添加的服务引用。双击Reference.svcmap文件。将有一个元素,您需要对其进行编辑。继续我的示例:保存文件,右键单击服务引用,然后选择更新服务引用。您可以根据需要添加任意数量的映射(我实际上需要两个)。效果与svcutil/namespace:方法相同,但不使用命令行util本身以方便更新。与svcutil的区别这种方法的缺点是您需要使用显式名称空间映射。使用svcutil,您可以选择映射未显式映射的所有内容(JohnSaunders所指的解决方案):svcutil/namespace:*,MyCompany.Services.MyProduct...您可能会考虑使用:但这不起作用,因为VisualStudio已隐式添加此映射,指向我们试图摆脱的生成的命名空间名称。上面的配置会导致VisualStudio抱怨重复键。广告显式命名空间:如果您没有在代码中指定显式命名空间,.NET似乎会为http://schemas.datacontract.org/2004/07/MyCompany.Services.MyProductforms生成一个uri。在我的示例中,您可以将其映射为与显式命名空间相同的方式,但我不知道这种行为是否有任何保证。因此,使用显式命名空间可能会更好。注意:将两个TargetNamespaces映射到同一个ClrNamespace似乎会破坏代码生成您的用例是错误的。您永远不应将服务作为参考。我相信svcutil.exe接受一个指定要使用的完整命名空间的开关。在VS2010及以后的版本中,有一种方法可以设置自定义命名空间。在解决方案资源管理器中,选择“显示所有文件”,然后在解决方案树中打开“Web引用”,选择服务,选择Reference.map节点,显示属性并设置自定义工具命名空间属性。不幸的是,我没有足够的声誉来显示屏幕截图。以上为C#学习教程:WCF服务引用命名空间与原名不同。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: