Android/iOS访问wcf传递参数为实体对象的问题

来源:互联网 发布:淘宝中老年女模特许洁 编辑:程序博客网 时间:2024/06/05 04:36

简单记录一下使用实体对象作为参数的传递!

在服务端使用webservice时是没有问题的,但是当替换成wcf时就出现传递的参数无法序列化的问题!

服务端代码:

Service1.svc

namespace WcfTeacherService{    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Service1”。    // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 Service1.svc 或 Service1.svc.cs,然后开始调试。    public class Service1 : IService1    {        public string DoWork(TestModel model)        {                       log4net.LogManager.GetLogger(this.GetType()).Error(model.AA);            return model.AA;        }    }}

TestModel.cs

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.ServiceModel;using System.Runtime.Serialization;namespace WcfTeacherService{    public class TestModel    {        public string AA { get; set; }    }}



Android客户端使用http://www.wsdl2code.com/pages/Home.aspx来自动生成所需要的代码;调用如下:

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Service1 service = new Service1();TestModel model = new TestModel();model.aA = "123";service.eventHandler = new IWsdl2CodeEvents() {@Overridepublic void Wsdl2CodeFinished(String methodName, Object Data) {@SuppressWarnings("unused")String aa = methodName;}@Overridepublic void Wsdl2CodeStartedRequest() {}@Overridepublic void Wsdl2CodeFinishedWithException(Exception ex) {}@Overridepublic void Wsdl2CodeEndedRequest() {}};try {service.DoWorkAsync(model);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
在WCF中以值类型作为参数,如:int,string,bool等都没有问题,但是自定义实体对象作为参数时,总是获取不到值!后来经过fiddler抓包反复对比,原来是TestModel的命名空间和DoWork方法的命名空间不一致所致!

所以要修改上面的TestModel.cs;在类名上面加上命名空间的声明

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.ServiceModel;using System.Runtime.Serialization;namespace WcfTeacherService{   [DataContract(Namespace="http://tempuri.org/")]    public class TestModel    {       [DataMember]        public string AA { get; set; }    }}
同时在接口上也加上相同的命名空间即可

namespace WcfTeacherService{    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。    [ServiceContract(Namespace="http://tempuri.org/"]    public interface IService1    {        [OperationContract]        string DoWork(TestModel model);    }}

只要修改服务端的命名空间即可,ios和android端自动生成的代码无须变化!

记录起来挺简单的,就这么简单的问题可是调试了一天多呀!难过


 android真机调试使用flidder抓取网络数据的方法:http://blog.csdn.net/zshq280017423/article/details/8928616

0 0