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

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

在服务端使用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端自动生成的代码无须变化!

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


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。