在Android上通过KSOAP2使用WCF服务会产生错误

时间:2012-03-01 11:09:46

标签: android wcf web-services ksoap2 android-ksoap2

我有以下WCF webservice

我想在android客户端中使用它。到目前为止,我的代码是

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%正确。

看起来NAMESPACESOAP_ACTION存在问题。我已经阅读了一些教程,他们说SOAP_ACTION是通过将NAMESPACEMETHOD_NAME连接起来的。所以,如果我按照教程我的SOAP_ACTION应该是

"http://tempuri.org/ValidateUser"

但方法SOAP_ACTION的{​​{1}}中提供的WSDL link

"ValidateUser"

我是WCF Webservices和SOAP的新手。任何人都可以告诉我如何实现"http://tempuri.org/IMsOnline/ValidateUser"中给出的方法。 看起来像缺少一些重要但不知道的东西。

2 个答案:

答案 0 :(得分:1)

如果同一个网络服务与Windows手机一起使用,那么你有一个NameSpace问题, 并且Web服务方法没有从SOAP消息中获取参数。由于您的ValidateUser没有参数,它只返回null / false。

我遇到了同样的问题。我通过显式定义命名空间解决了它,因此摆脱了默认命名空间WCF集,tempuri.org

以下是我的参考解决方案:

passing objects to wcf soap service from android using ksoap2; it sends and receives 0

答案 1 :(得分:0)

试试这个:

...

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

...
相关问题