gpt4 book ai didi

c# - 生成 WCF 代理的命名空间困境

转载 作者:行者123 更新时间:2023-12-04 16:56:31 25 4
gpt4 key购买 nike

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

using System.ServiceModel;
using Query.Search;

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

SearchTerms 类位于 Query.Search DLL 中,看起来像这样......
public class SearchTerms : List<SearchTerm> { }

... 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 命名空间,同时将 SearchTerms 类的命名空间保持为“Query.Search”,而无需手动修改输出文件,因此一个新的svcutil 的运行不会消除手动更改。这是可能的,我只是使用了/namespace 参数错误,还是每次生成代理时都必须手动修改输出文件?

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

最佳答案

你应该告诉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 中执行相同的任务。在这里看到我的回答:

How to use a custom type object at the client

更新:

我做了一些调查。如果您引用包含所有接口(interface)和数据协定的程序集,那么您是对的 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。

您有两个选择:
  • 在 Visual Studio 中生成代理。
  • 使用 ChannelFactory 在没有专业证书的情况下使用服务

    BasicHttpBinding myBinding = new BasicHttpBinding();

    EndpointAddress myEndpoint = new EndpointAddress("http://localhost/MathService/Ep1 ");

    ChannelFactory myChannelFactory = new ChannelFactory(myBinding, myEndpoint);

    IMath wcfClient1 = myChannelFactory.CreateChannel();

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

    关于c# - 生成 WCF 代理的命名空间困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10961185/

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