当前位置:编程学习 > C#/ASP.NET >>

webservice如何返回自定义类型

webservice如何返回自定义类型

//////////////////////////////////////类定义  /////////////////////////////////////
namespace HumanResource
{
[Serializable]  
public class Employee
{
protected string EmployeeName;
protected string EmployeePhone;
public Employee()
{
this.EmployeeName = "No Name";
this.EmployeePhone = "No phone";
}
public Employee(string m_name,string m_phone)
{
this.EmployeeName = m_name;
this.EmployeePhone = m_phone;
}

}
}
/////////////////////////////////////Webservice:////////////////////////////////////
using System;
.................
using HumanResource;
namespace ServiceTest
{
public class MyService : System.Web.Services.WebService
{
public MyService()
{
.........
}
...............
               //方法  
               [WebMethod]  
               public   Employee   GetEmployee( )  
                {  
            Employee m_emp = new Employee();
           return   m_emp; 
                }  
}
}
///////////////////////////////////////////////////调用Webservice////////////////////////////////
//引用Webservice 引用名为 WEBSWS
//如何调用GetEmployee得到Employee类型对象
using System;
...........
using HumanResource;
namespace TestHR
{
        ........
       WEBSWS.MyService m_ws = new WEBSWS.MyService();
       Employee   emp   =   m_ws.GetEmployee();  //报错
       //错误信息:  Cannot   implicitly   convert   type   'TestHR.localhost.Employee'   to   'HumanResource.Employee'  
        WEBSWS.Employee emp = m_ws.GetEmployee(); //正确
}
有什么办法使Employee   emp   =   m_ws.GetEmployee();  不报错,Employee类该怎么写? --------------------编程问答-------------------- 貌似这个比较合适WCF


首先,你给非常非常的确定,他们使用的是同一个类型,否则,系统会……

Web Services和WCF不同,好像所有类型都是自动生成的(指代理类),因此,要避免你说的那总情况
需要手动实现代理类了,比较简单的方法是修改已经生成好的代理类。不过这么做玩之后并不适合更新服务(因为会还原)

--------------------编程问答-------------------- 楼上的,怎么修改代理类才能让
       Employee   emp   =   m_ws.GetEmployee();  
不报错?

我记得测试local web service 的时候必须这么写:WEBSWS.Employee emp = m_ws.GetEmployee(); 
但是布置到服务器上以后
Employee   emp   =   m_ws.GetEmployee();  
这样写就不会报错了,不知道为什么 --------------------编程问答-------------------- 我就是这么用的,没发现什么报错 --------------------编程问答-------------------- 命名空间问题

你默认导入的Web Services,用了WEBSWS 命名空间

你要是把代理类的源码打开看看就知道了

能看到返回类型 xxx.employee 这样的完全限定名

--------------------编程问答-------------------- 做个强制类型转换试试看?
--------------------编程问答-------------------- To gyc:
我引用local跟服务器上的代理类都是这样的
Public Function methodname(ByVal objrequest As request) As response

你的意思local的应该是这样?
Public Function methodname(ByVal objrequest As request) As namespace.response
--------------------编程问答-------------------- 恩,差不多

导入的代理类,使用道路的名称作为命名空间,如Local

那默认那个就是Local.Response  ,而完整的名称可能是 App.Local.Response(假设你的项目跟命名空间是App)
你要用的类是是App.Response

说以你要把那个名字改成符合你的命名空间上, --------------------编程问答-------------------- 代理类自动将可序列化的自定义的实体类进行了xml序列化。
个人推荐尽量不要使用这种方式,而是使用自定义序列化的方式,序列化可以使用二进制的序列化方法。这样效率更高一些。
/////////////////////////////////////Webservice://////////////////////////////////// 
using System; 
................. 
using HumanResource; 
namespace ServiceTest 

public class MyService : System.Web.Services.WebService 

public MyService() 

......... 

............... 
               //方法   
               [WebMethod]   
               public   string   GetEmployee( )   
                {   
            Employee m_emp = new Employee(); 
           return   Serializer.Serialize(m_emp);  
                }   



在访问webservice的一端,先将返回的序列化之后的对象反序列化为实体类后再来使用。
using HumanResource; 
namespace ServiceClientTest 

public class MyServiceClient 

public MyServiceClient() 

......... 

............... 
               //方法   
                  
               public   Employee   GetEmployee( )   
                {   
            string strm_emp = service.GetEmployee( ); 
           return   Serializer.DeSerialize(m_emp) as Employee;  
                }   

}
客户端程序(可能也是个web程序)通过调用MyServiceClient的方法来访问WebService.
二进制序列化反序列化的方法:
public static string Serialize(object obj)
        {
            string serializedObject = null;
            if (obj != null)
            {
                IFormatter formatter = new BinaryFormatter();
                using (Stream stream = new MemoryStream())
                {
                    formatter.Serialize(stream, obj);
                    long count = stream.Length;
                    byte[] buff = new byte[count];
                    stream.Seek(0, SeekOrigin.Begin);
                    stream.Read(buff, 0, Convert.ToInt32(count));
                    stream.Close();
                    serializedObject = Convert.ToBase64String(buff);
                }
            }
            return serializedObject;
        }

public static object DeSerialize(string serializedObject)
        {
            object @object = null;
            if (serializedObject!="")
            {
                IFormatter fter = new BinaryFormatter();
                byte[] buff = Convert.FromBase64String(serializedObject);
                using (Stream stream = new MemoryStream(buff))
                {
                    @object = fter.Deserialize(stream);
                    stream.Close();
                }
            }
            return @object;
        }
希望对你的问题有帮助. :) --------------------编程问答-------------------- 可以直接调用WEBSERVICE实例化你的自定义类型啊,就和你实例化一个WEBSERVICE函数一样。。有什么区别吗? --------------------编程问答-------------------- TXH for gyc.我想我明白你意思了 --------------------编程问答-------------------- 定义方法不对,试试下面的
 
// 定义交换数据的类型
    [XmlRoot("Employee", Namespace = "http://work.example.com.cn")]
    public class Employee
    {
        [XmlElement("EmployeeName", IsNullable = false)]
        public string EmployeeName;

        [XmlElement("EmployeePhone", IsNullable = false)]
        public string EmployeePhone;
    } --------------------编程问答-------------------- 不明LZ在说什么 --------------------编程问答-------------------- lz要干嘛?
补充:.NET技术 ,  Web Services
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,