【问题标题】:Apache Axis client, ASMX service, array incompatibility woesApache Axis 客户端、ASMX 服务、阵列不兼容问题
【发布时间】:2015-09-18 17:01:51
【问题描述】:

我有一个由 Apache Axis 客户端调用的 .Net Web 服务。他们在我们的服务上调用了一个名为getBulkBalance 的方法,该方法为活跃玩家获取游戏中玩家的余额,用于滚动代码等。该调用适用于单个玩家请求,但不适用于多个请求,使getBulkBalance 相当...没用,因为还有一个getBalance 方法。

是因为有多个节点,如下图:

  <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
    <soapenv:Header/>
    <soapenv:Body>
      <tem:GetBulkBalanceRequest>
         <!--Optional:-->
         <tem:secureLogin>login</tem:secureLogin>
         <!--Optional:-->
         <tem:securePassword>password</tem:securePassword>
         <!--Zero or more repetitions:-->
         <tem:playerIDList>60</tem:playerIDList>
         <tem:playerIDList>61</tem:playerIDList>
      </tem:GetBulkBalanceRequest>
   </soapenv:Body>
 </soapenv:Envelope>

如果他们只打电话给一个,它工作正常。如果他们在一个节点中传入60,61,它工作正常。另一方不会/不能改变他们的客户端处理 Int64 数组的方式。

我的方法是这样的:

    [WebMethod]
    [SoapDocumentMethod(ParameterStyle = SoapParameterStyle.Bare, Action = "GetBulkBalance")]
    [return: XmlElement(ElementName = "GetBulkBalanceResponse")]
    public GetBulkBalanceResponse GetBulkBalance(GetBulkBalanceRequest GetBulkBalanceRequest)

GetBulkBalanceRequest 如下:

[Serializable]
public class GetBulkBalanceRequest
{
    [XmlElement(Namespace = Constants.ServiceNamespace)]
    public string secureLogin;
    [XmlElement(Namespace = Constants.ServiceNamespace)]
    public string securePassword;
    [XmlElement(Namespace = Constants.ServiceNamespace)]
    public Int64[] playerIDList;
}

关于如何让 Axis 和 WCF 发挥出色的任何想法?也许我缺少一些属性?提前致谢!

【问题讨论】:

  • @Derrek Dean:你得到的确切错误是什么(假设你有一个错误?
  • 它失败了,甚至无法执行用户代码。消息本身就好像它已损坏一样。但是,使用一个值就可以了。

标签: c# soap asmx axis


【解决方案1】:

德雷克,

如果客户端无需更改任何内容,您是否可以将列表声明为字符串并在服务器代码中进行解析?

[Serializable]
public class GetBulkBalanceRequest
{
    // ....
    [XmlElement(Namespace = Constants.ServiceNamespace)]
    public String playerIDList;
}

您的服务器代码将是:

[WebService(Namespace = Constants.ServiceNamespace)]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class WebService1 : System.Web.Services.WebService
{
    [WebMethod]
    [SoapDocumentMethod(ParameterStyle = SoapParameterStyle.Bare, Action = "GetBulkBalance")]
    [return: XmlElement(ElementName = "GetBulkBalanceResponse")]
    public GetBulkBalanceResponse GetBulkBalance(GetBulkBalanceRequest getBulkBalanceRequest)
    {
        Int64 [] ids = getBulkBalanceRequest.playerIDList
                            .Split(',')
                            .Select(s => Int64.Parse(s)).ToArray();
        return new GetBulkBalanceResponse { responseValue = "response42" };
    }
}

据我所知,您正在编写一个 ASMX 服务,而不是一个“真正的”WCF 服务。 使用 WCF,您可以在消息检查器中解析消息正文:

  1. 当然是客户端的 IClientMessageInspector
  2. IDispatcherMessageInspector 在服务器端

希望对你有帮助

【讨论】:

  • 这正在测试中——不过他们的速度很慢。玩等待游戏。
  • 奇怪的是,这就像一个魅力。惊人的!谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-11-30
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多