Я пытаюсь подключить разработку моего Android-приложения к веб-службе и не могу перехватить ответ (выдает ошибку выше);следующий фрагмент кода моего приложения:
@Override
protected String doInBackground(String... params) {
String URL = "https://MyDomain/Services/AccountManager.asmx";
String NAMESPACE = "http://tempuri.org/";
String METHOD_NAME = parameters.get("METHOD_NAME");
String ReturnValue;
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
// addProperty for each KeyPair in the Parameters HashMap
for (Map.Entry<String, String> parameter : parameters.entrySet()) {
if (!parameter.getKey().startsWith("_") && parameter.getKey() != "METHOD_NAME") {
request.addProperty(parameter.getKey() , parameter.getValue());
}
}
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.implicitTypes = true;
envelope.setOutputSoapObject(request);
HttpTransportSE httpTransportSE = new HttpTransportSE(URL);
try {
httpTransportSE.call(NAMESPACE + METHOD_NAME, envelope);
SoapPrimitive soapPrimitive = (SoapPrimitive) envelope.getResponse();
ReturnValue = soapPrimitive.getAttribute("StatusCode").toString();
} catch (Exception ex) {
ReturnValue = "Error: " + ex.getMessage();
}
return ReturnValue;
}
Ошибка выдается строкой
SoapPrimitive soapPrimitive = (SoapPrimitive) envelope.getResponse();
Я прочитал ряд статей / сообщений, в которых предлагается изменить предыдущую строку, наследующая строка:
Object soapPrimitive = (Object) envelope.getResponse();
Несмотря на то, что это «обходит» ошибку, возвращаемые значения из службы затем не называются:
- OK
- 2119100
- 278
- E
... вместо того, чтобы быть в пригодном для использования "соединении";
response.getAttribute("AccountNumber") = 2119100
response.getAttribute("AccountBalance") = 278
response.getAttribute("StatusCode") = "E"
У меня есть контроль надвеб-сервис, поэтому там можно вносить изменения, если это решение;фрагмент кода C # для службы:
[WebMethod(
Description = "Account Lookup",
MessageName = "Account",
EnableSession = false)]
public string Account(
string PostCode,
string Surname,
out double? AccountBalance,
out string AccountNumber,
out string StatusCode)
{
// MY STUFF HERE
AccountBalance = 50;
AccountNumber = 123456;
StatusCode = "A";
Return "OK";
}
Выше приведена значительно урезанная версия фактической службы, которая (для производства) вернула бы [например] полную разбивку финансовойтранзакции с начальным сальдо, текущим сальдо, НДС, процентами, скидками и т. д., поэтому отслеживание неназванного проиндексированного списка постепенно станет кошмаром обслуживания.
[править 22/02/2019]
Я изменил (и упростил) WebService, чтобы он принимал ТОЛЬКО значения INPUT
[WebMethod(
Description = "Account Lookup",
MessageName = "Account",
EnableSession = false)]
public string Account(
string PostCode,
string Surname)
.. и из этого метода я выполняю более глубокий вызов частного методаэто обрабатывало "out" параметры.Затем WebMethod превращает эти параметры в строку JSON и возвращает ее.Этот (довольно уродливый метод) работал до тех пор, пока я не захотел вернуть массив данных, который вернулся к исходной ошибке.
... следующим шагом (поскольку я не могу найти рабочее решение) будетпопробуйте то же самое с ответом XML.