问题描述
- 请问android/IOS如何使用WCF?
-
如题,新手接触app发现无法直接操作数据库,之前都是做网站,看了一些帖子发现需要使用webserver 于是就做了一个wcf 心想调用起来应该不难,但是由于java基础不好 软件android studio导入jar 也找不到方法...ios更是一筹莫展,期望有具体点的方法,指导一下到底如何调用wcf
解决方案
wcf配置为支持http绑定
最好配置为使用soap
http://www.cnblogs.com/iscode/archive/2012/05/09/2491513.html
这样用js或者ios去调用,就是标准的方法了。
解决方案二:
简单记录一下使用实体对象作为参数的传递!
在服务端使用webservice时是没有问题的,但是当替换成wcf时就出现传递的参数无法序列化的问题!
服务端代码:
Service1.svc
[csharp] view plaincopy
01.namespace WcfTeacherService
02.{
03. // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Service1”。
04. // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 Service1.svc 或 Service1.svc.cs,然后开始调试。
05. public class Service1 : IService1
06. {
07. public string DoWork(TestModel model)
08. {
09.
10. log4net.LogManager.GetLogger(this.GetType()).Error(model.AA);
11. return model.AA;
12. }
13. }
14.}
TestModel.cs
[csharp] view plaincopy
01.using System;
02.using System.Collections.Generic;
03.using System.Linq;
04.using System.Web;
05.using System.ServiceModel;
06.using System.Runtime.Serialization;
07.namespace WcfTeacherService
08.{
09. public class TestModel
10. {
11. public string AA { get; set; }
12. }
13.}
Android客户端使用http://www.wsdl2code.com/pages/Home.aspx来自动生成所需要的代码;调用如下:
[java] view plaincopy
01.@Override
02.protected void onCreate(Bundle savedInstanceState) {
03. super.onCreate(savedInstanceState);
04. setContentView(R.layout.activity_main);
05. Service1 service = new Service1();
06. TestModel model = new TestModel();
07. model.aA = "123";
08.
09. service.eventHandler = new IWsdl2CodeEvents() {
10. @Override
11. public void Wsdl2CodeFinished(String methodName, Object Data) {
12. @SuppressWarnings("unused")
13. String aa = methodName;
14. }
15.
16. @Override
17. public void Wsdl2CodeStartedRequest() {
18. }
19.
20. @Override
21. public void Wsdl2CodeFinishedWithException(Exception ex) {
22. }
23.
24. @Override
25. public void Wsdl2CodeEndedRequest() {
26. }
27. };
28. try {
29. service.DoWorkAsync(model);
30. } catch (Exception e) {
31. // TODO Auto-generated catch block
32. e.printStackTrace();
33. }
34.}
在WCF中以值类型作为参数,如:int,string,bool等都没有问题,但是自定义实体对象作为参数时,总是获取不到值!后来经过fiddler抓包反复对比,原来是TestModel的命名空间和DoWork方法的命名空间不一致所致!
所以要修改上面的TestModel.cs;在类名上面加上命名空间的声明
[csharp] view plaincopy
01.using System;
02.using System.Collections.Generic;
03.using System.Linq;
04.using System.Web;
05.using System.ServiceModel;
06.using System.Runtime.Serialization;
07.namespace WcfTeacherService
08.{
09. [DataContract(Namespace="http://tempuri.org/")]
10. public class TestModel
11. {
12. [DataMember]
13. public string AA { get; set; }
14. }
15.}
同时在接口上也加上相同的命名空间即可
[csharp] view plaincopy
01.namespace WcfTeacherService
02.{
03. // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
04. [ServiceContract(Namespace="http://tempuri.org/"]
05. public interface IService1
06. {
07. [OperationContract]
08. string DoWork(TestModel model);
09. }
10.}
只要修改服务端的命名空间即可,ios和android端自动生成的代码无须变化!
记录起来挺简单的,就这么简单的问题可是调试了一天多呀
http://blog.csdn.net/wuwo333/article/details/42873415 你看是不是这个?
解决方案三:
看我这篇博客,有你想要的完整代码。http://blog.csdn.net/chinacsharper/article/details/38386779