【问题标题】:Webservice remove the NameSpace from the webMethod Parameter ProblemWebservice 从 webMethod 参数问题中移除 NameSpace
【发布时间】:2011-07-27 13:00:55
【问题描述】:

我已经创建了 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

那么我如何将参数传递给服务。 请看报错截图

【问题讨论】:

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


    【解决方案1】:

    我不确定为什么要使用 XmlInclude、SoapInclude 和 XmlRoot 属性修改您的网页类,因为我认为它们仅适用于您打算对网页本身进行 XML/soap 序列化的情况。

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

    【讨论】:

      【解决方案2】:

      实现此功能的一种方法是实现EntityTranslator,这是一种获取数据合同实体并将其“翻译”到业务实体的模式。

      其实很简单。您只需创建两种方法:一种获取数据合约实体并从中创建业务实体,另一种获取业务实体并创建数据合约实体。

      可以找到带有附加链接的示例here

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

          换一种方式——网络服务定义了整个传输层,包括所有涉及的传输对象。您不能在此传输层中使用自己的对象(无论命名空间如何),因为服务器不知道它们 - 服务器只知道它定义的对象。

          所以在这种情况下,如果你想与它通信,你必须根据服务器的类型创建一个对象列表。

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

          【讨论】:

            【解决方案5】:

            我认为AutoMapper 应该可以为所欲为。

            例如

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

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

            您应该尝试将调用放在中心位置的Mapper.CreateMap(),它只会被调用一次,因为如果频繁调用它会很昂贵。

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                【解决方案7】:

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

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

                【讨论】:

                  猜你喜欢
                  • 2016-02-19
                  • 1970-01-01
                  • 2012-08-03
                  • 2023-03-23
                  • 1970-01-01
                  • 2013-12-30
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-04-30
                  相关资源
                  最近更新 更多