Web服务从webMethod参数问题中删除NameSpace

时间:2011-04-01 09:01:09

标签: c# asp.net wcf web-services namespaces

我创建了webMethod

服务

[WebMethod]    
  public void GetCommission(List <BOLibrary.Flight.DTContract>Loc)
 {
 }

在客户端,我传递参数 的客户端

List<BOLibrary.Flight.DTContract> BoList = new List<BOLibrary.Flight.DTContract>();
        BOLibrary.Flight.DTContract dtConboj = new BOLibrary.Flight.DTContract();
        dtConboj.ValidatingCarrier = "AA";
        BoList.Add(dtConboj);
        BOLibrary.Flight.DTContract[] pass = BoList.ToArray();
        service.GetCommission(pass);

但问题是service.GetCommission(pass)会考虑servicenameSpace.DTContract的参数 但在客户端的客户端我有BOLibrary.Flight.DTContract

那么如何将参数传递给服务。 请阅读错误消息Error i am getting while passing the parameter

的快照

7 个答案:

答案 0 :(得分:1)

这是预期的行为。没有办法改变它。

如果您希望能够在客户端和服务上使用完全相同的类型,则需要转移到WCF。

答案 1 :(得分:1)

我相信这是使用ASMX / WebMethod和Web References时的预期行为。也就是说,客户端和服务器应该是互斥的代码库。

如果要在服务的两端之间使用公共实体/库代码,可以使用SvcUtil/reference参数来生成可与WCF一起使用的代理,并使用来自共享库。从Web引用(使用wsdl.exe生成 - 我认为?)到WCF服务引用(使用svcutil.exe生成)move your client code相当容易。

答案 2 :(得分:0)

我不确定为什么您的网页类正在使用XmlInclude,SoapInclude&amp; XmlRoot属性,因为我认为它们仅适用于您打算使用XML / soap序列化网页本身。

编译错误的含义是BOLibrary.Flight.DTContract类不是来自生成的WebReference代码中的FPCommission.CommissionService命名空间。用于调用服务的所有客户端对象都应来自FPCommission命名空间。如果您在客户端和服务之间共享程序集,那么您的代码将无法运行。只需使用FPCommission.DTContract类而不是BOLibrary.Flight.DTContract类,您的代码就可以工作。

答案 3 :(得分:0)

实现这一目标的一种方法是实现EntityTranslator,这是一种采用数据合同实体并将其“转换”为业务实体的模式。

这很简单,真的。您所要做的就是创建两个方法:一个接收数据合同实体并从中创建业务实体,另一个接收业务实体并创建数据合同实体。

可以找到包含其他链接的示例here

答案 4 :(得分:0)

Web服务生成的客户端代码正在创建自己的服务器端对象版本。

根据定义,Web服务存在于应用程序范围之外并定义了一个接口对象,因此客户端域中的任何对象都不可能与服务定义的对象相同。

采用不同的方式 - webservice定义整个传输层,包括所涉及的任何传输对象。您不能在此传输层中使用您自己的对象(无论命名空间),因为服务器不知道它们 - 服务器只知道它定义的对象。

因此,在这种情况下,如果要与服务器进行通信,则必须从服务器类型创建对象列表。

正如其他人所提到的,如果您想要这样做,还有其他通信方法可以让您在客户端和服务器(即WCF)之间共享库。

答案 5 :(得分:0)

我认为AutoMapper应该能够做你想做的事。

e.g。

using AutoMapper;

// ...

Mapper.CreateMap<BOLibrary.Flight.DTContract, FPCommission.DTContract>();
Mapper.Map<List<BOLibrary.Flight.DTContract>, FPCommission.DTContract[]>(BoList);

请注意,您只需要设置基本类类型之间的映射 - AutoMapper将负责集合之间的映射。

你应该尝试将调用放在Mapper.CreateMap()中央的某个地方,只会被调用一次,因为如果经常调用它会很昂贵。

答案 6 :(得分:0)

在您的代码中,GetCommission方法需要一个List。 你的函数调用是发送一个数组 - 不是一个列表?