生成 WCF 代理时的名称空间困境

本文关键字:空间 困境 WCF 代理 生成 | 更新日期: 2023-09-27 18:36:43

我有几个消息协定,它们使用外部库来标准化多个服务之间的特定功能。他们的代码看起来有点像这样...

using System.ServiceModel;
using Query.Search;
[MessageContract(WrapperName = "MyMessageContract")]
public partial class MyMessageContract
{
    [MessageBodyMember(Name = "Search")]
    public SearchTerms Search { get;  set; }
}

类位于 Query.Search DLL 中,如下所示...

public class SearchTerms : List<SearchTerm> { }

。与搜索术语类也在同一 DLL 中。它在服务中工作得很好,并且知道我正在处理 Query.Search 类,但是当我生成代理时,这些类被重新分配给错误的命名空间,并且很难在 UI 中构建服务适配器。我正在使用带有以下参数的 svcutil...

/t:code /mc /n:*,MyProject.UI.Proxies /ct:System.Collections.Generic.List`1 /l:cs 
/o:WSProxies.cs /config:output.config http://localhost:49207/Service1.svc?wsdl 
http://localhost:49207/Service2.svc?wsdl http://localhost:49207/Service3.svc?wsdl

现在,我知道这里定义的命名空间参数基本上是将所有代理命名空间分配给 MyProject.UI.Proxies,如果我删除它,我的 Query.Search 类的命名空间设置正确。但是,这意味着所有其他代理现在都属于定义它们的默认"MyService.DataContracts"命名空间。所以我尝试使用...

/n:MyService.DataContracts,MyProject.UI.Proxies

。但没有运气,因为输出在生成后恢复为"MyService.DataContracts"。我希望能够做的是让我的代理具有"MyProject.UI.Proxies"的 UI 命名空间,同时将 SearchTerm 类的命名空间维护为"Query.Search",而无需手动修改输出文件,以便新运行 svcutil 不会清除手动更改。这是否可能,我只是错误地使用了/namespace 参数,还是每次生成代理时都必须手动修改输出文件?

编辑:经过一天徒劳的尝试,我只是创建了一个解决方法,在服务中创建一组类似的类并将它们转换为Query.Search类。仍然有兴趣知道我想要的是否可以完成,但形成我收集的内容,在消息协定中使用这些类注定它被列在与 MC 相同的命名空间下。

生成 WCF 代理时的名称空间困境

你应该告诉svcutil重用你的类,而不是与代理命名空间作斗争。这可以使用/reference参数来实现。

将所有此类类移动到单独的程序集也是一个好主意。否则,您将在 WCF 服务器和客户端之间直接引用在体系结构上不好的内容。

查看此链接以获取示例:

http://blogs.msdn.com/b/youssefm/archive/2009/10/09/reusing-types-in-referenced-assemblies-with-svcutil-s-r-switch.aspx

你也可以在Visual Studio中执行相同的任务。在这里看到我的答案:

如何在客户端使用自定义类型对象

更新:

我做了一些调查。你是对的 SVCUtil 不会生成代理类,如果你引用包含所有接口和数据协定的程序集。

这种行为与Visual Studio不同。Visual Studio似乎没有直接使用SVCUtil与WCF一起工作。

这是我尝试过的命令行:

C:'Windows'system32>svcutil /directory:D:'prog'myfolder /r:"D:'prog'SampleWcf'Server'bin'Debug'Contract.dll"  http://localhost:8080/Service/mex 

与您的代码的一个区别是我使用了元数据而不是 wsdl。

您有两种选择:

  1. 在Visual Studio中生成代理。
  2. 无需
  3. 使用ChannelFactory即可使用服务

    BasicHttpBinding myBinding = new BasicHttpBinding();

    端点地址 myEndpoint = new 端点地址("http://localhost/MathService/Ep1");

    ChannelFactory

    myChannelFactory = new ChannelFactory(myBinding, myEndpoint);

    IMath wcfClient1 = myChannelFactory.CreateChannel();

http://msdn.microsoft.com/en-us/library/ms734681.aspx