2014-04-19 2 views
0

Мне нужно отправить некоторые параметры в мой веб-сервис и получить результат. Я использовал ksoap2-андроид-сборочно-2,4-банку-с-dependencies.jar в Lib, мой веб-сервис будет работать должным образом:ksoap2 AsyncTask PropertyInfo не получена в webservice, почему?

 [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 которые включают в себя Params:

 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; 
    } 

, что я вижу, когда я проверяю отправить Params в LogCat:

TestParams{userName=01395175; password=password; ...} 

, но проблема: result0 = - - - - - это означает, что (для меня), что веб-сервис не получил Params. Я испытал много способов, но у вас есть достаточно опыта, чтобы знать, что является проблемой? позвольте мне сначала сказать, что проверить сеть и изменить многие способы, так что если вы видели или сталкивались с той же проблемой, дайте мне знать ... Спасибо.

+0

Я имел этот вопрос несколько недель назад. Являются ли ваши параметры userName, password, startRowIndex и т. Д. Именованными точно такими же (включая кадры) в качестве ваших параметров в вашем веб-сервисе? Это была моя проблема. Я передавал имя пользователя параметру «имя пользователя», когда мой веб-сервис ожидал параметра «userName». –

ответ

0

Проблема решена, но как? это произошло из-за 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 (Пространство имен = 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" />