0

次のWCF Webサービスがあります

私はアンドロイドクライアントでそれを消費したい.これまでの私のコードは

public class SOAP_TestActivity extends Activity {

  private final String NAMESPACE = "http://tempuri.org/";
  private final String URL = "http://50.19.226.15/Office365Admin/MsOnline.svc";
  private final String SOAP_ACTION = "http://tempuri.org/IMsOnline/ValidateUser";
  private final String METHOD_NAME = "ValidateUser";


  private final  String user_id= "khurram@office365trial.com.au";
  private final  String password= "friday@123";

  @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) {

                        boolean auth=doLogin();
                        System.out.println(auth);
                        Toast.makeText(getApplicationContext(), String.valueOf(auth), Toast.LENGTH_SHORT).show();

                }
           });   
     }

    private boolean doLogin() {   

   boolean result=false;

   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;         

   envelope.setOutputSoapObject(request);

   Log.d("myApp", request.toString());
   System.out.println(request);

   HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
   androidHttpTransport.debug = true;

   try {
           androidHttpTransport.call(SOAP_ACTION, envelope);

           SoapPrimitive soapPrimitiveResults = (SoapPrimitive)envelope.getResponse();                        

           Log.d("myApp", soapPrimitiveResults.toString());
           System.out.println("myApp" +soapPrimitiveResults);

                   if(soapPrimitiveResults.toString().equalsIgnoreCase("true"))
       {
                   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;

   }
   }

このコードは例外なく動作しますが、メソッドValidateUserが常に false を返すため、アプリケーションにログインできません。この同じ Web サービスは Windows Phone で使用されており、問題なく動作しています。また、ユーザー名とパスワードは 100% 正しいです。

NAMESPACEとに問題があるようSOAP_ACTIONです。私はいくつかのチュートリアルを行ってきましたが、SOAP_ACTIONは と連結NAMESPACEすることによって作成されていると言われていMETHOD_NAMEます。したがって、チュートリアルに従えばSOAP_ACTION

"http://tempuri.org/ValidateUser"

しかし、メソッドの でSOAP_ACTION与えられたのはWSDL link"ValidateUser"

"http://tempuri.org/IMsOnline/ValidateUser".

私は WCF Webservices と SOAP を初めて使用します。 で指定されたメソッドを実装する方法を誰か教えてくださいWSDL Document(link is at the top)。重要な何かが欠けているように見えますが、何がわかりません。

4

2 に答える 2

1

同じWebサービスがWindowsPhoneで正常に機能する場合は、名前空間の問題があり、WebサービスメソッドがSOAPメッセージからパラメーターを取得していません。また、ValidateUserはパラメーターを取得しないため、null/falseを返すだけです。

私も同じ問題を抱えていました。名前空間を明示的に定義して、デフォルトの名前空間WCFセットであるtempuri.orgを削除することで解決しました。

参考までに私の解決策は次のとおりです。

ksoap2を使用してAndroidからwcfsoapサービスにオブジェクトを渡す。0を送受信します

于 2012-10-26T21:52:59.417 に答える
0

これを試して:

...

Object response = envelope.getResponse();
String value = response.toString();

...
于 2012-03-01T23:17:33.980 に答える