简单记录一下使用实体对象作为参数的传递!
在服务端使用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来自动生成所需要的代码;调用如下:
@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端自动生成的代码无须变化!
记录起来挺简单的,就这么简单的问题可是调试了一天多呀!
时间: 2024-10-09 18:02:33