ksoap2 AsyncTask PropertyInfo не получен веб-сервисом, почему?
Мне нужно отправить некоторые параметры в мой веб-сервис и получить результат. Я использовал ksoap2-android-assembly-2.4-jar-with-dependencies.jar в lib, мой веб-сервис работает правильно:
[WebMethod]
public string TestParams(string userName, string password, string startRowIndex, string maximumRows, string OrderType, string IdOpera)
{
return userName + " - " + password + " - " + startRowIndex + " - " + maximumRows + " - " + OrderType + " - " + IdOpera;
}
В основном коде Java:
private class AsyncCall extends AsyncTask<String, Void, SoapObject > {
@Override
protected SoapObject doInBackground(String... params) {
if (Constants.DEBUG)Log.i(Constants.LOGTAG, "doInBackground");
AsynGetSellList list = new AsynGetSellList();
AsynGetSellList.setMAIN_REQUEST_URL(MAIN_REQUEST_URL);
AsynGetSellList.setMETHOD_NAME(METHOD_NAME);
AsynGetSellList.setNAMESPACE(NAMESPACE);
AsynGetSellList.setSOAP_ACTION(SOAP_ACTION);
javab = list.GetSellList(1);
return javab;
}
@Override
protected void onPreExecute() {
if (Constants.DEBUG)Log.i(Constants.LOGTAG, "onPreExecute");
pDialog = new ProgressDialog(SellList.this);
pDialog.setMessage("Please wait...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected void onProgressUpdate(Void... values) {
if (Constants.DEBUG)Log.i(Constants.LOGTAG, "onProgressUpdate");
}
@Override
protected void onPostExecute(SoapObject javab) {
if (Constants.DEBUG)Log.i(Constants.LOGTAG, "onPostExecute");
pDialog.dismiss();
if (isCancelled()) {
finish();
}
if (javab!=null){
fillSells(javab);
}
}
}
и GetSellList.java, которые включают параметры:
public SoapObject GetSellList(int startRowIndex) {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
// افزودن پارامترهای فراخوانی
request.addProperty("userName", "01395175");
request.addProperty("password", "123123");
request.addProperty("startRowIndex", "1");
request.addProperty("maximumRows", "50");
request.addProperty("OrderType", "1");
request.addProperty("IdOpera", "50");
if (Constants.DEBUG)Log.i(Constants.LOGTAG,"request = "+request);
//پاکت ساخته شده است
SoapSerializationEnvelope envelope = getSoapSerializationEnvelope(request);
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = getHttpTransportSE(MAIN_REQUEST_URL);
SoapObject javab = null;
try {
if (Constants.DEBUG)Log.i(Constants.LOGTAG,"envelope = "+envelope);
//فراخوانی وب سرویس با پاکت
androidHttpTransport.call(SOAP_ACTION, envelope);
//دریافت پاسخ از وب سرویس
// SoapObject result = (SoapObject)envelope.getResponse();
Object result0 = (Object)envelope.getResponse();
if (Constants.DEBUG)Log.i(Constants.LOGTAG,"result0 = "+result0);
SoapObject result = (SoapObject)result0;
if (Constants.DEBUG)Log.i(Constants.LOGTAG,"result = "+result);
javab = findTable(result);
} catch (Exception e) {
if (Constants.DEBUG)Log.i(Constants.LOGTAG,"Exception = "+e);
if (Constants.DEBUG)Log.i(Constants.LOGTAG,"Exception = "+e.getMessage());
e.printStackTrace();
}
return javab;
}
необходимы другие части кода:
public PropertyInfo addParam(String name, Object value) {
PropertyInfo propertyInfo = new PropertyInfo();
propertyInfo.name = name;
propertyInfo.type = value == null ? PropertyInfo.OBJECT_CLASS : value.getClass();
propertyInfo.setValue(value);
return propertyInfo;
}
private final static SoapSerializationEnvelope getSoapSerializationEnvelope(SoapObject request) {
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.implicitTypes = true;
envelope.setAddAdornments(false);
envelope.setOutputSoapObject(request);
return envelope;
}
что я вижу при проверке отправки параметров в logcat:
TestParams{userName=01395175; password=password; ...}
но проблема: result0 = - - - - -
это означает (для меня), что веб-сервис не получил params. Я проверил много способов, но у вас достаточно опыта, чтобы понять, в чем проблема? позвольте мне сначала рассказать о том, что проверили веб и изменили много способов, поэтому, если вы видели или столкнулись с той же проблемой, дайте мне знать... Спасибо.
1 ответ
Проблема решена, но как? это было из-за tempori.org, используемого по умолчанию в моем веб-сервисе. Я изменил его на URL своего веб-сайта, и он решил. Это была действительно очень глупая ошибка, потому что во многих случаях веб-сервис отвечает правильно, просто когда вы получаете DataSet, вы сталкиваетесь с ошибкой, малоизвестной. В любом случае, после одного дня полной пробной и ошибки это решено.
blogs.msdn.com/b/endpoint/archive/2011/05/12/how-to-eliminate-tempuri-org-from-your-service-wsdl.aspx
Как исключить tempuri.org из WCF Services WSDL Шаг 1: Объявите пространство имен в вашем контракте на обслуживание
Пространство имен может быть чем угодно. Люди обычно используют URI некоторой формы, но он не обязательно должен указывать на реальную веб-страницу. Часто люди используют идентификатор версии в namsepace, но нет никаких правил относительно того, что вы должны делать.
// Устранить tempuri.org из договора
// Если вы не хотите использовать константу, укажите здесь URI
// [ServiceContract (Namespace = " http://contoso.com/services")]
[ServiceContract (Namespace = Constants.Namespace)]
открытый интерфейс IService1
{
[OperationContract]
void DoWork();
}
Шаг 2: Объявите пространство имен в вашем сервисе
Пространство имен службы добавляется с атрибутом ServiceBehavior. Использование константы гарантирует, что пространство имен одинаково для контракта и сервиса.
// Если вы не хотите использовать константу, укажите здесь URI
// [ServiceBehavior (Namespace = " http://contoso.com/services")]
[ServiceBehavior (Namespace = Constants.Namespace)]
общедоступный класс Service1: IService1
{
public void DoWork()
{
}
}
Шаг 3: Установите связывающее пространство имен
<services>
<service name="EliminateTempUri.Service1">
<!-- Use a bindingNamespace to eliminate tempuri.org -->
<endpoint address=""
binding ="basicHttpBinding"
bindingNamespace="http://contoso.com/services"
contract="EliminateTempUri.IService1"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />