问题描述
webservice如何返回自定义类型//////////////////////////////////////类定义/////////////////////////////////////namespaceHumanResource{[Serializable]publicclassEmployee{protectedstringEmployeeName;protectedstringEmployeePhone;publicEmployee(){this.EmployeeName="NoName";this.EmployeePhone="Nophone";}publicEmployee(stringm_name,stringm_phone){this.EmployeeName=m_name;this.EmployeePhone=m_phone;}}}/////////////////////////////////////Webservice:////////////////////////////////////usingSystem;.................usingHumanResource;namespaceServiceTest{publicclassMyService:System.Web.Services.WebService{publicMyService(){.........}...............//方法[WebMethod]publicEmployeeGetEmployee(){Employeem_emp=newEmployee();returnm_emp;}}}///////////////////////////////////////////////////调用Webservice//////////////////////////////////引用Webservice引用名为WEBSWS//如何调用GetEmployee得到Employee类型对象usingSystem;...........usingHumanResource;namespaceTestHR{........WEBSWS.MyServicem_ws=newWEBSWS.MyService();Employeeemp=m_ws.GetEmployee();//报错//错误信息:Cannotimplicitlyconverttype'TestHR.localhost.Employee'to'HumanResource.Employee'WEBSWS.Employeeemp=m_ws.GetEmployee();//正确}有什么办法使Employeeemp=m_ws.GetEmployee();不报错,Employee类该怎么写?
解决方案
解决方案二:
貌似这个比较合适WCF首先,你给非常非常的确定,他们使用的是同一个类型,否则,系统会……WebServices和WCF不同,好像所有类型都是自动生成的(指代理类),因此,要避免你说的那总情况需要手动实现代理类了,比较简单的方法是修改已经生成好的代理类。不过这么做玩之后并不适合更新服务(因为会还原)
解决方案三:
楼上的,怎么修改代理类才能让Employeeemp=m_ws.GetEmployee();不报错?我记得测试localwebservice的时候必须这么写:WEBSWS.Employeeemp=m_ws.GetEmployee();但是布置到服务器上以后Employeeemp=m_ws.GetEmployee();这样写就不会报错了,不知道为什么
解决方案四:
我就是这么用的,没发现什么报错
解决方案五:
命名空间问题你默认导入的WebServices,用了WEBSWS命名空间你要是把代理类的源码打开看看就知道了能看到返回类型xxx.employee这样的完全限定名
解决方案六:
做个强制类型转换试试看?
解决方案七:
Togyc:我引用local跟服务器上的代理类都是这样的PublicFunctionmethodname(ByValobjrequestAsrequest)Asresponse你的意思local的应该是这样?PublicFunctionmethodname(ByValobjrequestAsrequest)Asnamespace.response
解决方案八:
恩,差不多导入的代理类,使用道路的名称作为命名空间,如Local那默认那个就是Local.Response,而完整的名称可能是App.Local.Response(假设你的项目跟命名空间是App)你要用的类是是App.Response说以你要把那个名字改成符合你的命名空间上,
解决方案九:
代理类自动将可序列化的自定义的实体类进行了xml序列化。个人推荐尽量不要使用这种方式,而是使用自定义序列化的方式,序列化可以使用二进制的序列化方法。这样效率更高一些。/////////////////////////////////////Webservice:////////////////////////////////////usingSystem;.................usingHumanResource;namespaceServiceTest{publicclassMyService:System.Web.Services.WebService{publicMyService(){.........}...............//方法[WebMethod]publicstringGetEmployee(){Employeem_emp=newEmployee();returnSerializer.Serialize(m_emp);}}}在访问webservice的一端,先将返回的序列化之后的对象反序列化为实体类后再来使用。usingHumanResource;namespaceServiceClientTest{publicclassMyServiceClient{publicMyServiceClient(){.........}...............//方法publicEmployeeGetEmployee(){stringstrm_emp=service.GetEmployee();returnSerializer.DeSerialize(m_emp)asEmployee;}}}客户端程序(可能也是个web程序)通过调用MyServiceClient的方法来访问WebService.二进制序列化反序列化的方法:publicstaticstringSerialize(objectobj){stringserializedObject=null;if(obj!=null){IFormatterformatter=newBinaryFormatter();using(Streamstream=newMemoryStream()){formatter.Serialize(stream,obj);longcount=stream.Length;byte[]buff=newbyte[count];stream.Seek(0,SeekOrigin.Begin);stream.Read(buff,0,Convert.ToInt32(count));stream.Close();serializedObject=Convert.ToBase64String(buff);}}returnserializedObject;}publicstaticobjectDeSerialize(stringserializedObject){object@object=null;if(serializedObject!=""){IFormatterfter=newBinaryFormatter();byte[]buff=Convert.FromBase64String(serializedObject);using(Streamstream=newMemoryStream(buff)){@object=fter.Deserialize(stream);stream.Close();}}return@object;}希望对你的问题有帮助.:)
解决方案十:
可以直接调用WEBSERVICE实例化你的自定义类型啊,就和你实例化一个WEBSERVICE函数一样。。有什么区别吗?
解决方案十一:
TXHforgyc.我想我明白你意思了
解决方案十二:
定义方法不对,试试下面的//定义交换数据的类型[XmlRoot("Employee",Namespace="http://work.example.com.cn")]publicclassEmployee{[XmlElement("EmployeeName",IsNullable=false)]publicstringEmployeeName;[XmlElement("EmployeePhone",IsNullable=false)]publicstringEmployeePhone;}
解决方案十三:
不明LZ在说什么
解决方案十四:
lz要干嘛?