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