代码之家  ›  专栏  ›  技术社区  ›  erlando

为什么WCF服务引用名称空间相对于我的WCF客户机项目的默认名称空间?

  •  1
  • erlando  · 技术社区  · 15 年前

    我有一个WCF服务,其命名空间为:

    MyCompany.MyApplication.Configuration.ConfigurationHelperService
    

    在客户端,我有一个名为的程序集,它使用此服务:

    MyCompany.MyApplication.Core (this is the default namespace)
    

    当我添加服务引用时,会要求我在 添加服务引用 对话最后被固定在客户端程序集命名空间的末尾:

    MyCompany.MyApplication.Core.MyCompany.MyApplication.Configuration
                                                       .ConfigurationHelperService
    

    因为此时要求我提供一个名称空间,所以指定远程服务名称空间的名称似乎很自然。i、 e.我想使用名称空间引用我的远程服务类 MyCompany.MyApplication.Configuration.ConfigurationHelperService 因为严格来说他们不是客户的一部分。

    我的问题是:

    • 这背后的基本原理是什么,这和语义学有关吗?
    • 我是否应该尝试通过修改客户端生成的源代码来获得我想要的名称空间来抵制改变这种行为?

    我已经经历了很长一段时间了(你在asmxweb服务客户机上也有同样的问题),但是从来没有看到一个书面的解释为什么visualstudio(我猜是的) svcutil.exe )是这样的。

    1 回复  |  直到 15 年前
        1
  •  1
  •   marc_s MisterSmith    15 年前

    嗯,我想你有两个选择,真的:

    • 如果控制连接的两端,例如编写服务器和客户机,则可以将所有共享项(如服务契约、数据契约等)放入一个单独的程序集中,并在客户机和服务器之间共享。这样,就不会有任何内容被复制,通信的两端将引用您选择的给定命名空间中完全相同的项

    • 习惯这样一个事实:如果在Visual Studio中添加WCF服务引用,基本上会得到大量的重复—因为如果不控制通信的两端,WCF实际上只能继续—服务和客户端之间交换的元数据(通过服务上的WSDL或MEX端点)。而且,由于这显然是客户机的一部分,客户机与服务完全分离(它们共享的通常都是XML模式中定义的wire格式,而不是其他格式),因此它的名称空间也将面向客户机。我认为这是一个(好的)特性,而不是我想尝试对抗的东西。。。。。

    默认情况下,在使用WCF的SOA世界中,客户机和服务是完全独立的。两者之间没有“远程对象”连接或类似的连接:客户机代理有一个方法调用,将传入的参数和服务器上要调用的方法的一些信息捆绑在一起,并将其全部序列化为一个序列化消息(读:基本上是一个text/XML消息)。该消息通过网络发送到服务器,然后服务器处理该消息并返回响应。

    推荐文章