Клиент Apache Axis, служба ASMX, проблемы несовместимости массивов
У меня есть веб-служба .Net, которая вызывается клиентом Apache Axis. Они вызывают метод на нашем сервисе под названием 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 в одном узле, это работает нормально. Другая сторона не будет / не может изменить способ, которым их клиент обрабатывает массивы Int64s.
Мой метод выглядит так:
[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 ответ:
Деррек,
Если ничего не нужно менять в клиенте, может быть, вы могли бы объявить свой список как строку и сделать синтаксический анализ в коде вашего сервера ?
[Serializable] public class GetBulkBalanceRequest { // .... [XmlElement(Namespace = Constants.ServiceNamespace)] public String playerIDList; }Ваш серверный код будет выглядеть следующим образом:
Из того, что я вижу, вы пишете службу ASMX, а не "настоящую" службу WCF. С помощью WCF можно проанализировать текст сообщения в инспекторе сообщений:[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" }; } }
- IClientMessageInspector для клиентской стороны, конечно
- IDispatcherMessageInspector на сервер
Надеюсь, это поможет
Comments