2014-02-08 38 views
0

我有一个C#Webservice和一个Eclipse Android应用程序项目。我想从KSOAP2 2.3版web服务中获得一个xml文件。该web服务工作,并让我回到当前的XML文档,它也似乎像我得到了与android应用程序的web服务的连接,但我总是会得到一个异常,说web服务无法识别HTTP标头的值“SOAPAction” 。Java Android:使用SOAP从Webservice获取Xml文件

的Webservice:

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


    class DBConnect 
    { 
     private MySqlConnection connection; 
     private string server; 
     private string database; 
     private string uid; 
     private string password; 
    } 

    private void Initialize() 
    { 
      server = "localhost"; 
      database = "eagles_db"; 
      uid = "root"; 
      password = ""; 
      string connectionString; 
      connectionString = "SERVER=" + server + ";" + "DATABASE=" + 
      database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";"; 

      connection = new MySqlConnection(connectionString); 
    } 

public XmlDocument abmeldungen() 
     { 
      XmlDocument doc = new XmlDocument(); 
      XmlNode root; 
      XmlNode tempHeader; 
      XmlNode tempInhalt; 

      List<int> lstIDs = new List<int>(); 
      List<string> lstNamen = new List<string>(); 
      string ausgabe = string.Empty; 



      string conStr = ConfigurationManager.ConnectionStrings["dbstring"].ConnectionString; 

      string befehl = "Select abmeldung.cf_created, abmeldung.datum, abmeldung.grund, web_users.name From abmeldung Inner Join web_users On abmeldung.cf_user_id = web_users.id Order By abmeldung.cf_created Desc"; 



      MySql.Data.MySqlClient.MySqlCommand cmd = new MySqlCommand(befehl, connection); 



      connection.Open(); 

      MySql.Data.MySqlClient.MySqlDataReader reader = cmd.ExecuteReader(); 



      root = doc.CreateElement("Abmeldungen"); 
      doc.AppendChild(root); 


      tempHeader = doc.CreateElement("Abmeldungen"); //doc.CreateElement(reader["reportTitle"].ToString()); 

      root.AppendChild(tempHeader); 

      while (reader.Read()) 
      { 
       tempInhalt = doc.CreateElement("Name"); 
       tempHeader.AppendChild(tempInhalt).InnerText = reader["name"].ToString(); 

       tempInhalt = doc.CreateElement("Grund"); 
       tempHeader.AppendChild(tempInhalt).InnerText = reader["grund"].ToString(); 

       tempInhalt = doc.CreateElement("datum"); 
       tempHeader.AppendChild(tempInhalt).InnerText = reader["datum"].ToString(); 

       tempInhalt = doc.CreateElement("erstellt"); 
       tempHeader.AppendChild(tempInhalt).InnerText = reader["cf_created"].ToString(); 
      } 

      reader.Close(); 

      connection.Close(); 

      return doc; 

     } 

     [WebMethod] 
     public XmlDocument abmeldung() 
     { 
      DBConnect con1 = new DBConnect(); 
      return con1.abmeldungen(); 
     } 

一切工作在Firefox和我得到正确的xml文件

应用:

package de.maturaprojekt.sema; 

import org.ksoap2.SoapEnvelope; 
import org.ksoap2.serialization.PropertyInfo; 
import org.ksoap2.serialization.SoapObject; 
import org.ksoap2.serialization.SoapSerializationEnvelope; 
import org.ksoap2.transport.HttpTransportSE; 


import android.os.Bundle; 
import android.app.Activity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Toast; 


public class Abmeldungen extends Activity { 

    public static String NAMESPACE = "http://tempuri.org/"; 
    public static String SOAP_ACTION = "http://10.0.2.2:28266/Service1.asmx/abmeldung"; 
    public static String METHOD_NAME = "abmeldung"; 

    public static String URL = "http://10.0.2.2:28266/Service1.asmx"; 

    public static String response; 

    public static String abmeldungen1() 
    { 
     //SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

     return "Error"; 
    } 

    public static String abmeldungen() 
    { 


     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 


     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 

     envelope.setOutputSoapObject(request); 

     try 
     { 
      HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 

      androidHttpTransport.call(SOAP_ACTION, envelope); 

      // SoapResult 
      SoapObject result = (SoapObject)envelope.getResponse(); //body.In 


      if (result != null) 
      { 
       response=result.toString(); //getProperty(0) 

       if(response.equals("false")) 
       { 
        return "Error"; 
        //error, 
       } 

       else 
       { 
        return "IT WORKS"; 
        // everything works correctly 
       } 

      } 

      else 
      { 
       return "ERROR2"; 
       // no answer from webservice 
      } 
     } 

     catch (Exception exc) 
     { 
      Log.i("tom",exc.toString()); 
      return "ERROR3"; 
      // andere Probleme 
     } 



    } 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_abmeldungen); 
    } 

    public void btn_abfragen(View view) 
    { 
     //Toast.makeText(this, "abgerufen", Toast.LENGTH_SHORT).show(); 
     String return22 = abmeldungen(); 

     Toast.makeText(this,return22, Toast.LENGTH_LONG).show(); 

    } 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.abmeldungen, menu); 
     return true; 
    } 
} 

我用10.10.2.2作为模拟的Android设备上,因为本地主机正常的“本地主机”将是仿真设备的本地主机,10.10.2.2是正确的本地主机。

我希望我的问题不是太混乱,如果有人能帮助我,我将非常感激。谢谢

+0

你是从哪里在你的代码复制肥皂行动? – kingAm

+0

这是一个学校项目,我从一个较旧的项目获取代码,这与我的项目类似,他们尝试以同样的方式连接到Web服务。 – semaa

回答

0
public static String SOAP_ACTION = "http://10.0.2.2:28266/Service1.asmx/abmeldung"; 

我觉得你的SOAP动作应该是这样的,

"http://tempuri.org/Service1/abmeldung" 

您需要在您的WSDL进行检查。

使用打开浏览器你的WSDL,

http://10.0.2.2:28266/Service1.asmx 

搜索WSDL:在WSDL绑定标签。

在操作结合标签搜索ambeldung

你可以找到你的SOAP动作定义为,

<wsdl:binding name="BasicHttpBinding_Service1" type="tns:example"> 
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> 
<wsdl:operation name="ambeldung"> 
<soap:operation soapAction="http://tempuri.org/examplesoapaction/example" style="document"/> 
...... 
...... 
+0

非常感谢!正确的SOAP Action是:“http://tempuri.org/abmeldung”现在可以工作。 – semaa