Skip to main content
 首页 » 编程设计

c#之在 Android 中调用 .Net Web 服务失败

2024年01月11日31cloudgamer

我是 Android 编程新手。

我在这一行中有一个错误:

androidHttpTransport.call(SOAP_ACTION, envelope); 

异常 ="error(s)_during_the_evaluation"

我最初尝试调用我的 .NET Web 服务但失败了。 为了隔离问题,我尝试调用 w3schools Web 服务。

我的安卓代码

public class Hello_ProjActivity extends Activity { 
    /** Called when the activity is first created. */ 
 
    private static final String SOAP_ACTION = "http://microsoft.com/webservices/CelsiusToFahrenheit"; 
    private static final String METHOD_NAME = "CelsiusToFahrenheit";//"AndroidTest";//"GetAppData4";// "HelloWorld"; 
    private static final String NAMESPACE = "http://microsoft.com/webservices/";//"http://tempuri.org/"; 
 
    private static final String URL = "http://www.w3schools.com/webservices/tempconvert.asmx"; 
 
 
    //http://192.168.2.104/SB_Site/WS_Android.asmx/HelloWorld 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        //setContentView(R.layout.main); 
 
        //Start my code 
        //create layout 
        TableLayout layout1 = new TableLayout (this); 
 
        /**Start create textView**/ 
        TextView tv = new TextView(this); 
        tv.setText("Hello, Androiddddd  xxx"); 
        //setContentView(tv); 
        layout1.addView(tv); 
        /**End create textView**/ 
 
        /**Start Create button Call WebSrvice**/ 
        Button btn = new Button(this);  
        btn.setText("MyButton");  
        btn.setWidth(20); 
        btn.setHeight(20); 
 
        //set btn event listener 
        btn.setOnClickListener(new OnClickListener() { 
             public void onClick(View view) { 
                 WS_Caller(); 
                } 
        }); 
 
        layout1.addView(btn); 
        /**End Create button Call WebSrvice**/ 
 
        /**Start Create button Create Xml**/ 
        Button btn2 = new Button(this);  
        btn2.setText("Create Xml");  
        btn2.setWidth(20); 
        btn2.setHeight(20); 
 
        //set btn event listener 
        btn2.setOnClickListener(new OnClickListener() { 
             public void onClick(View view) { 
 
                 CreateXml(); 
                } 
        }); 
 
        layout1.addView( btn2); 
        /**End Create button Create Xml**/ 
 
         /********Start Create Alert Dialog**************************/ 
        AlertDialog.Builder alt_bld = new AlertDialog.Builder(this); 
 
        alt_bld.setMessage("Do you want to close this window ?");//.setCancelable(false); 
 
        AlertDialog alert = alt_bld.create();  
        // Title for AlertDialog  
        alert.setTitle("Title"); 
 
        alert.setButton("OK", new DialogInterface.OnClickListener() {   
              public void onClick(DialogInterface dialog, int which) {   
                return;   
            } });    
 
        alert.show(); 
 
 
        super.setContentView(layout1); 
 
        /********End Create Alert Dialog**************************/ 
 
        //generateAppObj(); 
    } 
 
 
public String WS_Caller() 
    { 
        //1 
        SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME); 
 
        //2 --set webservice params 
 
        PropertyInfo pi = new PropertyInfo(); 
        pi.setName("Celsius"); 
        pi.setValue(2); 
        pi.setType(int.class); 
        Request.addProperty(pi); 
 
      /*  PropertyInfo pi2 = new PropertyInfo(); 
        pi2.setName("Operand2"); 
        pi2.setValue(5); 
        pi2.setType(int.class); 
        Request.addProperty(pi2); 
        */ 
        //3 
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
        envelope.dotNet = true; 
        envelope.setOutputSoapObject(Request); 
 
        //4 
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
 
        //5   
        try {   
 
             androidHttpTransport.call(SOAP_ACTION, envelope); 
             SoapObject response = (SoapObject)envelope.getResponse(); 
             int result =  Integer.parseInt(response.getProperty(0).toString());  
 
            } 
        catch (Exception e) {  
            //tv2.setText(e.getMessage());  
        } 
 
        return "xxx"; 
    } 
} 

AndroidManifest.xml :

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.helloandroid" 
    android:versionCode="1" 
    android:versionName="1.0" > 
 
    <uses-sdk android:minSdkVersion="14" /> 
 
    <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
    <!--<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    --> 
    <application 
        android:icon="@drawable/ic_launcher" 
        android:label="@string/app_name" > 
        <activity 
            android:label="@string/app_name" 
            android:name=".Hello_ProjActivity" > 
            <intent-filter > 
                <action android:name="android.intent.action.MAIN" /> 
                <category android:name="android.intent.category.LAUNCHER" /> 
                <!-- David Add --> 
                <uses-permission android:name="android.permission.INTERNET" /> 
            </intent-filter> 
        </activity> 
    </application> 
 
</manifest> 

请您参考如下方法:

试试这段代码

import org.ksoap2.SoapEnvelope;  
import org.ksoap2.serialization.PropertyInfo;  
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.os.Bundle;  
import android.util.Log;  
import android.widget.TextView;  
public class AndroidWebService extends Activity {  
private final String NAMESPACE = "http://www.webserviceX.NET/";  
private final String URL = "http://www.webservicex.net/ConvertWeight.asmx";  
private final String SOAP_ACTION = "http://www.webserviceX.NET/ConvertWeight";  
private final String METHOD_NAME = "ConvertWeight";  
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) {  
super.onCreate(savedInstanceState);  
setContentView(R.layout.main);  
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);  
String weight = "3700";  
String fromUnit = "Grams";  
String toUnit = "Kilograms";  
PropertyInfo weightProp =new PropertyInfo();  
weightProp.setName("Weight");  
weightProp.setValue(weight);  
weightProp.setType(double.class);  
request.addProperty(weightProp);  
PropertyInfo fromProp =new PropertyInfo();  
fromProp.setName("FromUnit");  
fromProp.setValue(fromUnit);  
fromProp.setType(String.class);  
request.addProperty(fromProp);  
PropertyInfo toProp =new PropertyInfo();  
toProp.setName("ToUnit");  
toProp.setValue(toUnit);  
toProp.setType(String.class);  
request.addProperty(toProp);  
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);  
envelope.dotNet = true;  
envelope.setOutputSoapObject(request);  
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);  
try {  
androidHttpTransport.call(SOAP_ACTION, envelope);  
SoapPrimitive response = (SoapPrimitive)envelope.getResponse();  
Log.i("myApp", response.toString());  
TextView tv = new TextView(this);  
tv.setText(weight+" "+fromUnit+" equal "+response.toString()+ " "+toUnit);  
setContentView(tv);  
} catch (Exception e) {  
e.printStackTrace();  
}  
}  
} 

您必须按如下方式向 AndroidManifest.xml 添加 INTERNET 权限

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.sencide" 
android:versionCode="1" 
android:versionName="1.0">  
<application android:icon="@drawable/icon" android:label="@string/app_name">  
<activity android:name=".AndroidWebService" 
android:label="@string/app_name">  
<intent-filter>  
<action android:name="android.intent.action.MAIN" />  
<category android:name="android.intent.category.LAUNCHER" />  
</intent-filter>  
</activity>  
</application>  
<uses-permission android:name="android.permission.INTERNET"></uses-permission>  
</manifest>