2011-10-22 18 views
8

ここ数日から、Androidコードを使用してローカルWebサービスを呼び出す作業を行ってきました。私はAndroidでksoapライブラリを使用して、.NETで作成したSOAP Webサービスを呼び出しています。しかし、私のコードで何か問題があると感じるのは、私のアプリからのWebサービスをcatchブロックにヒットさせたときの応答です。私はAndroidのコードをデバッグしようとしましたが、私はまだ私の問題を解決することができません。 誰かが何が間違っているのか、これを行う簡単な方法を教えてください。AndroidモバイルアプリケーションからローカルWebサービスを呼び出す方法

 package com.demo; 
     import java.net.SocketException; 
     import org.ksoap2.SoapEnvelope; 
     import org.ksoap2.serialization.SoapObject; 
     import org.ksoap2.serialization.SoapPrimitive; 
     import org.ksoap2.serialization.SoapSerializationEnvelope; 
     import org.ksoap2.transport.AndroidHttpTransport; 
     import android.app.Activity; 
     import android.app.ProgressDialog; 
     import android.os.AsyncTask; 
     import android.os.Bundle; 
     import android.util.Log; 
     import android.view.View; 
     import android.view.View.OnClickListener; 
     import android.widget.Button; 
     import android.widget.EditText; 

    public class Login extends Activity { 
private static final String SOAP_ACTION = "http://tempuri.org/GetLoginDetails"; 
    private static final String METHOD_NAME = "GetLoginDetails"; 
    private static final String NAMESPACE = "http://tempuri.org/"; 
    private static final String URL = "http://10.0.2.2/testlogin/Service1.asmx"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Button signin = (Button) findViewById(R.id.regsubmitbtn); 

     signin.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 


         EditText etxt_user = (EditText) findViewById(R.id.usereditlog); 
         user_id = etxt_user.getText().toString(); 
         EditText etxt_password = (EditText) findViewById(R.id.pwdeditlog); 
         password = etxt_password.getText().toString(); 

         new LoginTask().execute(); 
       } 
     }); 
} 

String user_id; 
String password; 
String auth=null; 
private class LoginTask extends AsyncTask<Void, Void, Void> { 

    private final ProgressDialog dialog = new ProgressDialog(
        Login.this); 

    protected void onPreExecute() { 
      this.dialog.setMessage("Logging in..."); 
      this.dialog.show(); 
    } 

    protected Void doInBackground(final Void... unused) { 

      auth = doLogin("lalit", "lalit"); 
      return null; // don't interact with the ui! 
    } 

    protected void onPostExecute(Void result) { 
     if (this.dialog.isShowing()) { 
      this.dialog.dismiss(); 
     } 

     } 


     private String doLogin(String user_id, String password) { 

    SoapPrimitive resultstring = null; 
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
    request.addProperty("user", user_id); 
    request.addProperty("password", password); 
    SoapSerializationEnvelope soapenvelope = new SoapSerializationEnvelope(
        SoapEnvelope.VER11); 
    soapenvelope.dotNet = true;              
    soapenvelope.setOutputSoapObject(request); 

    AndroidHttpTransport httptransport = new AndroidHttpTransport(URL); 
    httptransport.debug = true; 

    try { 
      httptransport.call(SOAP_ACTION, soapenvelope); 
      resultstring = (SoapPrimitive) soapenvelope.getResponse(); 
      //Log.d("Authenticaion", resultstring+""); 
      System.out.println(resultstring); 


    } 
    catch (SocketException ex) { 
     Log.e("Error : " , "Error on soapPrimitiveData() " + ex.getMessage()); 
     ex.printStackTrace(); 
    } catch (Exception e) { 
     Log.e("Error : " , "Error on soapPrimitiveData() " + e.getMessage()); 
     e.printStackTrace(); 
    } 
    return resultstring+""; 

    } 
    } 
    } 

自分のWebサービスコード:

 using System; 
     using System.Collections; 
     using System.ComponentModel; 
     using System.Data; 
     using System.Linq; 
     using System.Web; 
     using System.Web.Services; 
     using System.Web.Services.Protocols; 
     using System.Xml.Linq; 
     using System.Data.SqlClient; 

    namespace LoginDetails 
    { 
    [WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [ToolboxItem(false)] 
// [System.Web.Script.Services.ScriptService] 
    public class Service1 : System.Web.Services.WebService 
    { 


    [WebMethod] 
    public String GetLoginDetails(string UserName, string Password) 
    { 

    try 
     { 
    using (SqlConnection myConnection = new SqlConnection(@"Data Source= .\SQLEXPRESS;Initial Catalog=student;User ID=sa;Password=demo")) 
    { 
     myConnection.Open(); 

     using (SqlCommand myCommand = new SqlCommand()) 
     { 
      myCommand.Connection = myConnection; 
      myCommand.CommandText = "SELECT COUNT(*) FROM Login WHERE UserName = @UserName AND Password = @Password"; 
      myCommand.Parameters.Add("@UserName", SqlDbType.VarChar).Value = UserName; 
      myCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = Password; 
      return (int)myCommand.ExecuteScalar() == 1 ? "success" : "bad username or password"; 
     } 
    } 
} 
catch (Exception ex) 
    { 
    Console.WriteLine(ex.Message); 
    return "an error occurred."; 
    } 

    } 

    } 


    } 

私のlogcat:

 10-22 21:49:17.635: DEBUG/dalvikvm(117): GC_EXTERNAL_ALLOC freed 901 objects/  

     10-22 21:49:18.015: WARN/KeyCharacterMap(117): No keyboard for id 0 
     10-22 21:49:18.015: WARN/KeyCharacterMap(117): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 
     10-22 21:49:22.275: INFO/ARMAssembler(58): generated s scanline__00000077:03515104_00000000_00000000 [ 33 ipp] (47 ins) at [0x23df98:0x23e054] in 675711 ns 
     10-22 21:49:42.025: INFO/System.out(274): an error occurred. 
     10-22 21:49:42.045: WARN/InputManagerService(58): Window already focused, ignoring focus gain of: [email protected] 

my output during web service call

答えて

6

ワーキングここ

は私が今まで実施してきた私のAndroidのコードですウィットh kSOAP2は挑戦的かもしれません...私は知っています。しかし、それは良い図書館であり、私はそれを働かせることができました。私はAndroid上でkSOAP2を使って作業しています。単純なパラメータと複雑なパラメータを渡し、配列を受け取り、JDBC WebRowSetオブジェクトをワイヤで処理する方法について議論します。

http://roderickbarnes.com/blog/droid-chronicles-web-services-handling-complex-parameters

サイト上kSOAP2での作業上の他のブログの記事があります。私はこれが役立つことを願っています

+0

ウル応答のために非常に多くのuをありがとう!はい、私はあなたのリンクを試してみましょう、それは私のために働く場合はknw! :-) –

9

どういうわけか私は自分の問題を解決することができました。私はこの質問に答えていますので、今後この記事を参照する人には役に立ちます。だからここ

が変更されたコードです:

   package com.demo; 
      import java.net.SocketException; 
      import org.ksoap2.SoapEnvelope; 
      import org.ksoap2.serialization.SoapObject; 
      import org.ksoap2.serialization.SoapPrimitive; 
      import org.ksoap2.serialization.SoapSerializationEnvelope; 
      import org.ksoap2.transport.HttpTransportSE; 
      import android.app.Activity; 
      import android.app.ProgressDialog; 
      import android.os.AsyncTask; 
      import android.os.Bundle; 
      import android.util.Log; 
      import android.view.View; 
      import android.view.View.OnClickListener; 
      import android.widget.Button; 
      import android.widget.EditText; 

    public class Login extends Activity { 

    private final String NAMESPACE = "http://tempuri.org/"; 
    private final String URL = "http://10.0.2.2/testlogin/Service1.asmx"; 

    String user_id; 
    String password; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
     { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Button signin = (Button) findViewById(R.id.regsubmitbtn); 
     signin.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 


         EditText etxt_user = (EditText) findViewById(R.id.usereditlog); 
         user_id = etxt_user.getText().toString(); 
         EditText etxt_password = (EditText) findViewById(R.id.pwdeditlog); 
         password = etxt_password.getText().toString(); 

         new LoginTask().execute(); 

       } 
      }); 
    } 

    private boolean doLogin(String user_id, String password) { 

    boolean result=false; 
    final String SOAP_ACTION = "http://tempuri.org/GetLogin"; 
    final String METHOD_NAME = "GetLogin";  
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

    request.addProperty("userid", user_id); 
    request.addProperty("password",password); 
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    envelope.dotNet = true; // Set this variable to true for 
                  // compatibility with what seems to be the 
                  // default encoding for .Net-Services. 
    envelope.setOutputSoapObject(request); 

    System.out.println(request); 

    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 


    try { 
      androidHttpTransport.call(SOAP_ACTION, envelope); 
      SoapPrimitive response = (SoapPrimitive)envelope.getResponse(); 
      Log.i("myApp", response.toString()); 
      System.out.println("response" +response); 

        if(response.toString().equalsIgnoreCase("success")) 
     { 
        result = true; 

     } 

    }catch(SocketException ex) 
    { 
     Log.e("Error : " , "Error on soapPrimitiveData() " + ex.getMessage()); 
     ex.printStackTrace(); 
    } 
    catch (Exception e) { 
     Log.e("Error : " , "Error on soapPrimitiveData() " + e.getMessage()); 
      e.printStackTrace(); 
    } 
    return result; 

    } 


private class LoginTask extends AsyncTask<Void, Void, Void> { 

    private final ProgressDialog dialog = new ProgressDialog(
        Login.this); 

    protected void onPreExecute() { 

      this.dialog.setMessage("Logging in..."); 
      this.dialog.show(); 

    } 


    protected Void doInBackground(final Void... unused) { 

     boolean auth=doLogin(user_id,password); 
     System.out.println(auth); 

     return null;// don't interact with the ui! 
    } 


    protected void onPostExecute(Void result) { 


      if (this.dialog.isShowing()) { 
      this.dialog.dismiss(); 
     }   
     } 

    } 

    } 
+0

this.dialog.show();でエラーが発生しています。新しいLoginTask()。execute();この両方の行...どのように私は解決することができます –

+0

ありがとうございました! =) –

関連する問題