Трудно сделать запрос на мыло в веб-сервис .NET из приложения для Android - PullRequest
1 голос
/ 11 ноября 2011

Я сделал в .NET метод веб-службы под названием «Логин» и опубликовал его на своем локальном хосте (IIS). Метод просто принимает 2 строковых параметра (имя пользователя и пароль) проверяет базу данных, которая есть у меня на моем сервере sql, если есть пользователь, который соответствует этим параметрам, и если он находит, что кто-то возвращает 1, иначе он возвращает 0. Из моего браузера это все отлично работает.

Я пытался найти способ с помощью приложения для Android (сначала просто возьмите результат и покажите его на экране). Вот код (я нашел много бит здесь и там):

public class LoginCheck extends Activity {

    private static final String SOAP_ACTION = "http://tabtobook.org/Login";
    private static final String METHOD_NAME = "Login";
    private static final String NAMESPACE = "http://tabtobook.org/";
    private static final String URL = "http://192.168.1.2/TabBookServices/Users.asmx";
    private TextView tv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
         /** Called when the activity is first created. */
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv=(TextView)findViewById(R.id.tv);
        ServiceCall();
    }
    public void ServiceCall()
    {
        try{
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        String A="user1";
        request.addProperty("Username", A);
        String B="user1";
        request.addProperty("Password", B);

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

        androidHttpTransport.call(SOAP_ACTION, envelope);

         SoapObject result = (SoapObject)envelope.getResponse();
         tv.setText(result.toString());
        }       

        catch (final IOException e)
        {
            ((TextView) findViewById(R.id.tView)).setText("test3");
            e.printStackTrace();

        } catch (final XmlPullParserException e)

        {
            e.printStackTrace();
        } catch (final Exception e)

        {
            e.printStackTrace();
        }
    }
}

Начиная с моей отладки, программа выдает «окончательное исключение e» (самое последнее в моем коде), когда оно идет в строке «androidHttpTransport.call (SOAP_ACTION, envelope);». Из WSDL я получаю:

targetNamespace="http://tabtobook.org/", location="http://localhost/TabBookServices/Users.asmx, soapAction="http://tabtobook.org/Login"

(Я не скопировал все это, потому что не мог сделать это здесь по какой-то причине. В любом случае, в том же веб-сервисе есть и другие неуместные методы) Поэтому я думаю, что я правильно понял NAMESPACE, METHOD_NAME, SOAP_ACTION и URL. Но, будучи новичком в мыле, я не уверен.

Так что не так? Неправильный ли запрос конверта, или я неправильно использую androidHttpTransport? (Или может и то и другое!)

РЕДАКТИРОВАТЬ: я положил несколько строк из logcat. Я думаю, что это исключение android.os.NetworkOnMainThreadException. Должен ли я попробовать что-то вроде Asynchtask справиться с этим?

11-11 21: 17: 53.607: D / AndroidRuntime (4574): выключение виртуальной машины 11-11 21: 17: 53.667: I / AndroidRuntime (4574): ПРИМЕЧАНИЕ: не удалось подключить нить «Нить Binder # 3» 11-11 21: 17: 53.667: D / dalvikvm (4574): GC_CONCURRENT освобождено 102K, 77% свободно 483K / 2048K, пауза 1 мс + 3 мс 11-11 21: 17: 53.667: D / dalvikvm (4574): отладчик отключился; Реестр объектов имел 1 записей 11-11 21: 17: 54.117: W / System.err (4491): android.os.NetworkOnMainThreadException 11-11 21: 17: 54.237: W / System.err (4491): в android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1084) 11-11 21: 17: 54.237: W / System.err (4491): at libcore.io.BlockGuardOs.connect (BlockGuardOs.java:74) 11-11 21: 17: 54.248: W / System.err (4491): at libcore.io.IoBridge.connectErrno (IoBridge.java:127) 11-11 21: 17: 54.248: W / System.err (4491): at libcore.io.IoBridge.connect (IoBridge.java:112) 11-11 21: 17: 54.298: W / System.err (4491): на java.net.PlainSocketImpl.connect (PlainSocketImpl.java:192) 11-11 21: 17: 54.298: W / System.err (4491): на java.net.PlainSocketImpl.connect (PlainSocketImpl.java:459) 11-11 21: 17: 54.298: W / System.err (4491): на java.net.Socket.connect (Socket.java:842) 11-11 21: 17: 54.307: W / System.err (4491): at libcore.net.http.HttpConnection. (HttpConnection.java:77) 11-11 21: 17: 54.317: W / System.err (4491): at libcore.net.http.HttpConnection. (HttpConnection.java:50)


Я сделал это с помощью Asynchtask: (Я не редактирую первый пост, чтобы все там существовало)

private class DownloadWebPageTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... urls) {
        String response = "";
        try {

                SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
                HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
                String A="user2";
                request.addProperty("Username", A);
                String B="user2";
                request.addProperty("Password", B);
                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                envelope.dotNet=true;
                envelope.setOutputSoapObject(request);

                androidHttpTransport.call(SOAP_ACTION, envelope);
                SoapObject result = (SoapObject)envelope.bodyIn; 
                response=result.toString();                     

                }

             catch (Exception e) {
                e.printStackTrace();

            }
        return response;
    }

    @Override
    protected void onPostExecute(String result) {
        tv.setText(result);
    }
}

public void ServiceCall() {
    DownloadWebPageTask task = new DownloadWebPageTask();
    task.execute(); 
    }
}

На моем экране отображается «LoginResponse {LoginResult = 1;}», если пользователь существует, или «LoginResponse {LoginResult = 0;}», если он не существует. Так что метод работает отлично!

Теперь у меня есть 2 проблемы, чтобы сделать его модулем входа в систему, как я хочу (конечно, я буду искать их):

  1. Мне нужен способ взять только результат "0" или "1" из метода. Или я думаю, что я мог бы использовать всю строку. Но когда я пытаюсь что-то вроде "if (result.equals (" LoginResponse {LoginResult = 1;} "))", это не работает (оно не получает истинное значение). В чем проблема?

  2. Я хочу, чтобы пользователь ввел данные. Поэтому я должен передать аргументы AsyncTask. Это возможно? Или мне следует выполнить чтение ввода (установить слушателя на кнопку) внутри класса AsyncTask?

EDIT: для номера 2 я нашел ответ здесь -> Android: Как я могу передать параметры в OnPreExecute () AsyncTask?

EDIT: для номера 1 не хватало только места!

if(result.equals("LoginResponse{LoginResult=1; }"))

отлично работает! Я хотел бы знать, как получить только результат методов (0 или 1), хотя. Если кто-то знает, пожалуйста, ответьте!

1 Ответ

0 голосов
/ 12 ноября 2011

Пожалуйста, предоставьте больше информации о том, как вы настраиваете свой сервис Dot.Net.В частности, тип привязки, который вы используете, и версия используемой платформы Dot.Net.

Наилучший подход при использовании служб Dot.Net WCF в гетерогенной клиентской среде - это создать себе простой Java-клиентиспользовать службу, чтобы гарантировать, что привязки и конфигурация безопасности в вашем стеке WCF настроены открытым способом, который может использоваться другими технологиями.Например, в WCF 4.0 каждый тип привязки, за исключением basicHttpBinding, обеспечивает аутентификацию пользователя и безопасность передачи, что требует функциональной совместимости клиента.

Как только вы опробуете гетерогенный Java-клиент, вы лучше поймете, чтоВы должны сделать это и для других клиентов, не являющихся WCF.

Наряду с тем же принципом, попробуйте использовать службу WCF с помощью SoapUI.Это инструмент Java, который позволяет достичь той же цели, что и ваш сервис в гетерогенной среде.

...