首先申明不是标题党,花了一个礼拜研究了WCF和WinForm还有Android交互最后还是放弃了。WCF配置太严谨了。用了各种解决方案还是无法完美实现。
考虑到这个项目本身对安全性要求不是很高。所以还是改用Webservice实现了。下面开始:
WebService端:
HelloWorld
[WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 // [System.Web.Script.Services.ScriptService] public class Service1 : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; } [WebMethod] public string SetValue(string value) { return "您输入的是"+value; } }
原生代码+赋值测试
接下来是
WebClient端的代码
Service1SoapClient ssc = new Service1SoapClient(); string s=ssc.HelloWorld(); MessageBox.Show(s); Service1SoapClient sc = new Service1SoapClient(); string ss = sc.SetValue("123"); MessageBox.Show(ss);
这个很好实现,最重要的是Android端的
String nameSpace = "http://tempuri.org/"; String nameSpace = "http://tempuri.org/"; String methodName = "SetValue"; String soapAction = "http://tempuri.org/SetValue"; String url = "http://10.0.2.2:43117/Service1.asmx";// 后面加不加那个?wsdl参数影响都不大 // 建立webservice连接对象 org.ksoap2.transport.HttpTransportSE transport = new HttpTransportSE( url); transport.debug = true;// 是否是调试模式 // 设置连接参数 SoapObject soapObject = new SoapObject(nameSpace, methodName); PropertyInfo pi = new PropertyInfo(); pi.setName("value");// webservice接口的参数名,大小写必须跟dotnet中的webservice暴露出来的名字一致 pi.setValue("123"); soapObject.addProperty(pi);// 将自定参数加入请求对象中 // 设置返回参数 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER10);// soap协议版本必须用SoapEnvelope.VER11(Soap // V1.1) envelope.dotNet = true;// 注意:这个属性是对dotnetwebservice协议的支持,如果dotnet的webservice // 不指定rpc方式则用true否则要用false envelope.bodyOut = transport; envelope.setOutputSoapObject(soapObject);// 设置请求参数 // envelope.addMapping(nameSpace, "User", user.getClass());// 传对象时必须,参数namespace是webservice中指定的, // name是服务器类型的名称, // claszz是自定义类的类型 try { transport.call(soapAction, envelope); SoapObject sb = (SoapObject) envelope.bodyIn;// 服务器返回的对象存在envelope的bodyIn中 System.out.println(envelope.getResponse());// 直接将返回值强制转换为已知对象 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); }
成功返回数据。
结帖!
浙公网安备 33010602011771号