我创建了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
那么如何将参数传递给服务。 请阅读错误消息
的快照答案 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。 你的函数调用是发送一个数组 - 不是一个列表?