草庐IT

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

coder 2024-05-25 原文

我在服务引用使用的命名空间方面遇到了问题。我有许多 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/

有关c# - WCF 服务引用命名空间与原始命名空间不同的更多相关文章

  1. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  4. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  5. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  6. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  7. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  8. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

  9. ruby - 一个 YAML 对象可以引用另一个吗? - 2

    我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的ruby​​yaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir

  10. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

随机推荐