Тайм-аут вызова веб-службы .NET (разработчик Android использует KSOAP2)

1

При попытке вызвать метод веб-службы .NET я получаю исключение Java Socket Execution "Operation timed out". Я следил за множеством примеров в Интернете, чтобы мой андроид вызывал веб-службу .net.

Я запускаю веб-службу, используя VS2010 в режиме отладки. Веб-метод, который я вызываю, очень прост → "string GetVersion()"

Я прочитал несколько сообщений, которые нужно настроить для eclipse для доступа к Интернету, изменив настройки прокси-сервера "Настройки → Общие → Сетевые подключения" в меню "Окно". Я не смог точно определить, что мне нужно настроить в прокси, чтобы заставить работу работать, если это проблема.

Я также попытался получить доступ к корневой странице веб-сервиса .net(service.asmx) с моего андроида без успеха. Я могу получить доступ к странице asmx без проблем с помощью IE на локальном компьютере. Я отключил брандмауэр, и это тоже ничего не решило. Это первый раз, когда я пытался получить доступ к веб-службе с удаленного компьютера, когда он работал с использованием VS2010 в режиме отладки.

Я не знаю, есть ли проблема с конфигурацией на стороне eclipse или на стороне VS2010.

Я также запускаю Windows 7 Home Premium.

Любые идеи?

Ниже приведен фрагмент кода...

private static final String SOAP_ACTION = "http://192.168.1.151/MyWebService/GetVersion";
private static final String METHOD_NAME = "GetVersion";   
private static final String NAMESPACE = "http://192.168.1.151/MyWebService"; 
private static final String URL = "http://192.168.1.151/MyService.asmx";

private void Connect()
{
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    envelope.dotNet=true; 
    envelope.setOutputSoapObject(request); 

    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 

    System.out.println("DEBUG >> HttpTransport.call()");

    try
    {         
       androidHttpTransport.call(SOAP_ACTION, envelope);
    }
    catch(IOException iexc)
    {
     System.out.println("EXCEPTION >> " + iexc.toString());
    }
    catch(XmlPullParserException xexc)
    {
     System.out.println("EXCEPTION >> " + xexc.toString());
    }

    try
    {
       Object result = (Object)envelope.getResponse();

       tv.setText(result.toString());
    }
    catch (SoapFault sp)
    {
     System.out.println("EXCEPTION >> " + sp.toString());
    }
}
Теги:
web-services
visual-studio-2010

4 ответа

0

Если у вас возникла проблема с вызовом веб-службы в android, Вы можете использовать код ниже, чтобы вызвать веб-службу и получить ответ. Убедитесь, что ваш веб-сервис возвращает ответ в Формат таблицы данных. Этот код поможет вам, если вы используете данные из SQL Server. Если вы используете MYSQL, вам нужно изменить одну вещь, просто заменив слово NewDataSet на предложение obj2=(SoapObject) obj1.getProperty("NewDataSet"); на DocumentElement

private static final String NAMESPACE = "http://tempuri.org/"; 
private static final String URL ="http://localhost/Web_Service.asmx?";// you can use   IP address instead of localhost
private static final String METHOD_NAME = "Function_Name";
private static final String SOAP_ACTION = NAMESPACE+METHOD_NAME;

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
request.addProperty("parm_name",prm_value);// Parameter for Method
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {
androidHttpTransport.call(SOAP_ACTION, envelope);//call the eb service Method
} catch (Exception e) {
e.printStackTrace();}//Next task is to get Response and format that response
SoapObject obj,obj1,obj2,obj3;
obj= (SoapObject) envelope.getResponse();
obj1=(SoapObject) obj.getProperty("diffgram");
obj2=(SoapObject) obj1.getProperty("NewDataSet");
for(int i=0;i<obj2.getPropertyCount();i++)//the method getPropertyCount() return the number of rows
{
obj3=(SoapObject) obj2.getProperty(i);  
obj3.getProperty(0).toString();//value of column 1
obj3.getProperty(1).toString();//value of column 2
//like that you will get value from each column
}

Если у вас есть проблемы с этим, вы можете написать мне.

0

Получите jar файл "ksoap2-android" из здесь.

Добавьте это как "Добавить внешний JAR" в проект Eclipse.

Затем используйте объект AndroidHttpTransport, как показано в фрагменте кода ниже:

try 
        {
            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
            request.addProperty("a", "15");
            request.addProperty("b", "20");
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.dotNet=true; 
            envelope.setOutputSoapObject(request);
            AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(URL);
            androidHttpTransport.call(SOAP_ACTION, envelope);
            SoapPrimitive result = (SoapPrimitive)envelope.getResponse();
            returnMessage = result.toString();
        }
        catch (SoapFault sf){
            returnMessage = "FAULT:\n";
            String faultString = "Code: " + sf.faultcode + "\nString: " +
            sf.faultstring;
            Log.d(TAG , "fault : " + faultString);
            returnMessage += faultString;
        }
        catch( Exception e )
        {
            Log.d(TAG , "exception e = "+ e.getMessage());
            returnMessage = "Call Exception:" + e.toString();
        }


    return returnMessage;

Надеюсь, что это поможет.

0

попробуйте развернуть службу в IIS.

0

Если вы запустите свой .Net-web-сервис в режиме отладки VS2010, скорее всего, вы используете веб-сервер Cassini. К сожалению, невозможно удаленно получить доступ к сайтам, размещенным на Cassini:

Конечно, вы можете сделать переадресацию портов, чтобы обойти это ограничение.

  • 0
    Спасибо за информацию. Я попробую, чтобы мой андроид увидел страницу root asmx. Я понял, что не упомянул, что мое приложение для Android через eclipse находится на локальной машине в качестве веб-службы, работающей в режиме отладки.
  • 0
    Вы используете локальный URL-адрес?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню