2011-11-11 1 views
1

.NETで「ログイン」というWebサービスメソッドを作成しました。これを自分のlocalhost(IIS)に公開しました。このメソッドは、これらのパラメータに一致するユーザーが存在する場合、SQL Serverにあるデータベースの2つの文字列パラメータ(ユーザー名とパスワード)のチェックを行い、誰かが1を返した場合は0を返します。正常に動作します。アンドロイドアプリから.NET WebサービスへのSOAP要求を作成するのが難しい

私はアンドロイドアプリでメソッドに到達しようとしました(最初は結果を画面に表示します)。ここでは、コード(私はこことそこから多くのビットを見つけた)です:

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" 

(。私はその理由のためにここにそれを行うことができなかった原因私は、それをすべてコピーしませんでした。とにかく、同じWebサービスで他の無関係な方法がある) だから私は思います私はNAMESPACE、METHOD_NAME、SOAP_ACTIONとURLを取得しています。しかし、石鹸の初心者である私は確信することはできません。

何が問題なのですか?リクエストエンベロープが不正な形式ですか、androidHttpTransportを間違って使用していますか? (または両方とも!)

EDIT:logcatからいくつかの行を挿入します。私はそれが例外をスローする "android.os.NetworkOnMainThreadException"だと思う。私はそれを処理するためにAsynchtaskのようなものを試すべきですか?

11-11 21:17:53.607:D/AndroidRuntime(4574):17:53.667:VM 11-11 21のシャットダウンI/AndroidRuntime(4574)注:スレッドアタッチ「バインダースレッド#3 'が失敗しました 11-11 21:17:53.667:D/dalvikvm(4574):GC_CONCURRENTは102K、フリーは483K/2048K、一時停止は1ms + 3ms 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 .StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084) 11-11 21:17:54.237:W/System.err(4491):libcore.io.BlockGuardOs.connect(BlockGuardOs.java:74) 11-11 21:17:54.248:W/System.err(4491):libcore.io.IoBridge.connectErrno(IoBridge.java:127) 11-11 21:17:54.248:W/System.err(4491) ):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):libcore.net.http.HttpConnection (HttpConnection.java:77) 11-11 21:17:54.317:(4491)をSystem.err/W:libcore.net.http.HttpConnectionで(HttpConnection.java:50)


私はAsynchtaskを使用して、それをやった: (everytingが存在するように、私は最初の投稿を編集しないでください)

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: How can I pass parameters to AsyncTask's onPreExecute()?

EDIT:欠けていたものを数1のため をちょうどスペースでした!

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

が問題ありません。私は方法の結果(0または1)を得る方法を知りたいです。もし誰かが答えてください知っている!

+0

logcatから例外/スタックトレースを投稿できますか? – Torid

+0

hmmm ..これで、logcatにNetworkOnMainThreadExceptionが表示されます。もちろん、プログラマーは止まらない。つまり、それはandroidHttpTransport.call(SOAP_ACTION、envelope)を置く必要があることを意味します。別のスレッド内のコマンドですか?または非同期タスクでですか? – george

+0

私はAsyncTaskが良い方法だと思います...私は、一連のHTTP GET/POSTをやります。各リクエスト/レスポンスはAsyncTask doInBackground()にあり、onPostExecute()のフラグを設定します。このフラグは、新しいAsyncTaskで次のリクエスト/レスポンスをユーザーに報告します。良いことは、あなたがほとんどすべての状態を必要としない10-20メッセージの非常に可変なシーケンスです。すべては一度に1ステップずつ駆動されます。 – Torid

答えて

0

Dot.Netサービスの設定方法の詳細をご記入ください。特にあなたが使用しているバインディングのタイプとあなたが採用しているDot.Netフレームワークのバージョン。

最善のアプローチ異種クライアント環境でDot.Net WCFサービスを使用すると、あなたのWCFスタック上のバ​​インディングとセキュリティ設定があること、オープンな方法で設定されていることを確認するために自分自身にサービスを利用するための単純なJavaクライアントを構築することです他の技術によって消費される可能性があります。たとえば、WCF 4.0では、basicHttpBindingを除くすべてのバインディングタイプは、クライアントに機能的に互換性があることを要求するユーザー認証と転送セキュリティを提供します。

異種Javaクライアントを実証すれば、他の非WCFクライアントにも必要なことをよりよく理解できます。

同じ考え方に沿って、SoapUIを使用してWCFサービスを使用してみてください。これはJavaツールであり、異種環境でサービスを証明するという同じ目標を達成します。

+0

それは石鹸サービスであり、WFCサービスはありません。私はそれがUsers.asmxサフィックスから見ることができると思います。とにかく、私が下に書いたように、私はそれを消費することができたので、問題はサービスタイプではありませんでした。あなたの返事をありがとうございます、それは有益でした! – george

関連する問題