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

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

时间: 2024-08-02 20:53:01

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

ios页面间传递参数四种方式

ios页面间传递参数四种方式 1.使用SharedApplication,定义一个变量来传递. 2.使用文件,或者NSUserdefault来传递 3.通过一个单例的class来传递 4.通过Delegate来传递. IOS开发使用委托delegate在不同窗口之间传递数据是本文要介绍的内容,主要是来讲解如何使用委托delegate在不同窗口之间传递数据,具体内容来看详细内容.在IOS开发里两个UIView窗口之间传递参数方法有很多,比如 前面3种方法,暂且不说,这次主要学习如何使用通过Dele

Android Handler之Message传递参数

最近发现Message,发送消息可以传递参数,这个思路很好,所以写了一个例子,点击屏幕,给Activity发送一个消息,传递两个参数,并把这个activity销毁掉! 程序打开界面: 点击屏幕,销毁activity弹出Toast: MainActivity: package com.cn.Android; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android

android fragement之间互相传递参数

在Activity中加载Fragment的时候.有时候要使用多个Fragment切换.并传值到另外一个Fragment.也就是说两个Fragment之间进行参数的传递.查了很多资料.找到两种方法.一种是通过共同的Activity传递.这种方法是在Activity里面添加一个字段.来临时保存要一些值. 其实我开始想的是用SharedPreferences,不过想想太麻烦! 然后翻了一下Fragment的API.找到了另外一个方法来传递.就像Activity一样便捷的实现参数传递程序中的一段代码.是

Android开发之Fragment传递参数的几种方法

Fragment在Android3.0开始提供,并且在兼容包中也提供了Fragment特性的支持.Fragment的推出让我们编写和管理用户界面更快捷更方便了. 但当我们实例化自定义Fragment时,为什么官方推荐Fragment.setArguments(Bundle bundle)这种方式来传递参数,而不推荐通过构造方法直接来传递参数呢?为了弄清这个问题,我们可以做一个测试,分别测试下这两种方式的不同 首先,我们来测试下通过构造方法传递参数的情况 public class FramentT

[iOS]观察者模式如何传递参数 addObserver:forKeyPath:options:context:

注册一个观察者 - (void)addNewObserver { [object addObserver:self forKeyPath:@"oneKey" options:NSKeyValueObservingOptionNew context:(__bridge_retained void *)(pragma)]; } context:需要传递的对象是一个(void *)类型的数据,这是一个C类型的对象,我们需要做的就是将id类型的对象转成C类型. pragma是需要传递的具体数据

IOS调用WCF提供的服务方法,但是方法的参数是WCF那边自定义的对象,这样有办法调用么,如果可以IOS应该怎么传参呢?请问有了解的么,

最近做一个项目后端使用WCF接收Android手机拍照并带其它参数保存到服务器里:刚好把最近学习的WCF利用上,本以为是个比较简单的功能应该很好实现,没想到其中碰到不少问题,在网上搜索很久一直没有想到的解决方案,最后实现对数据流的分段写入然后后端再来解析流实现的此功能:后端运用WCF中的REST来接收数据:REST还是比较简单的知识,若是不懂可以简单网上了解一下:下面我们先了解一些本次运用到的理论知识: 一:理论知识 由于低层协议特性限制,WCF的流模式只支持如下四种:1:BasicHttpBi

Android访问WCF服务

原文链接:http://www.cnblogs.com/VinC/archive/2011/02/24/1964049.html 本章目的: 用Wcf建立可以上Android可以访问的数据服务, 数据传输格式采用比较适合于移动互联网传输的Json格式. 服务的开发流程我们按照 服务契约(ServiceContract), 服务实现(Service), 实体对象模型(Model) 及服务发布的流程来介绍. 由于自己对Http请求的链接认识的比较浅,对于有些问题没法做出清楚明了的解释, Androi

Android访问WCF服务(使用json实现参数传递)

经过多日努力, 终于勉强弄明白了Android访问WCF服务的方法. 服务端实现 一, 实现服务. 操作契约 [csharp] view plaincopy [ServiceContract] public interface IService { [OperationContract] [WebInvoke( BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, Reque

Android 批量设置监听器,监听器传递参数,重写监听器构造函数

这个问题困扰了我好几天,就在我做的课程表应用中,每个页面有15个TextView,每个都要设置监听器,但是这还不是难事,难的是,用匿名内部类实现监听借口的时候,还要再在里面设置监听器!简而言之,TextView长按变为EditText,EditText点击完成之后把值传回TextView,这一个地方需要两个监听器. 我最早的实现方法是(mon_tv[ ]是一个TextView数组,mon_et[ ]是一个EditText数组): mon_tv[1].setOnLongClickListener(