Apache Axis客户端,ASMX服务,阵列不兼容问题

时间:2015-09-18 17:01:52

标签: c# soap asmx axis

我有一个由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发挥出色的想法?也许我遗失了一些属性?提前谢谢!

1 个答案:

答案 0 :(得分:2)

Derreck,

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

[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服务,而不是一个真实的&#34; WCF服务。 使用WCF,您可以在消息检查器中解析消息正文:

  1. 当然是客户端的IClientMessageInspector
  2. 服务器端的IDispatcherMessageInspector
  3. 希望有所帮助