简单记录一下使用实体对象作为参数的传递!
在服务端使用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; }
}
}
@Override
protected 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() {
@Override
public void Wsdl2CodeFinished(String methodName, Object Data) {
@SuppressWarnings("unused")
String aa = methodName;
}
@Override
public void Wsdl2CodeStartedRequest() {
}
@Override
public void Wsdl2CodeFinishedWithException(Exception ex) {
}
@Override
public void Wsdl2CodeEndedRequest() {
}
};
try {
service.DoWorkAsync(model);
} catch (Exception e) {
// TODO Auto-generated catch block
e.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.youkuaiyun.com/zshq280017423/article/details/8928616