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" />

Другие вопросы по тегам