在工作中用dotnet来编写webservice时遇到了这样一个问题:譬如一个对象里有一个object类型的属性,和其它一些值类型的属性,当对这个object类型的属性赋值一个已知类型对象数组时,在调试里看到结果返回正常,在ie下查看该方法页面显示提示http 500错误;在firefox下查看,说某某对象不可用。为了这个问题想了好久,最好根据firefox提示的原因找到了答案,原来是webservice在序列化的时候找不到对object赋值的属性的具体类型,所以出错了,但是想想也挺郁闷的,因为这个类型明明在项目中有啊,为什么它就偏偏找不到这个类型啊?不解中!后来再在webserivce页面中添加了一个用于返回该类型数组的任意方法后问题解决了。原来是因为它在页面中没有找到这个类型,服务器在序列化对象的时候必须要明确指定一个类型,客户端里的引用代理并没有这个实体的类型所以导致了错误。
文字叙述可能有点问题请见谅,可结合下面例子看看应该可以看得明白,呵呵。
下面是代码:
public class CommObject
{
private object _obj;
private int _type;
public object ObjectClass
{
get { return _obj;}
set { _obj = value;}
}
public int Type
{
get { return _type;}
set { _type = value;}
}
}
public class User
{
private string _name;
private int _age;
public string Name
{
get { return _name;}
set { _name = value;}
}
public int Age
{
get { return _age;}
set { _age = value;}
}
}
[WebMethod(EnableSession=true, Description="test")]
public CommObject Test()
{
CommObject com = new CommObject();
com.Type = 0;
User u1 = new User();
u1.Name = "azhi";
u1.Age = 25;
User [] us = new User[] { u1 };
com.ObjectClass = us;
return com;
}
直接这样编译通过,调试进去也能运行到return语句,继续运行到结束,页面上就报错了。
只能在页面上再加一个方法,方法名随便都行,如:
[WebMethod(EnableSession=true, Description="test")]
public User [] Test2()
{
return null;
}
编译运行,通过了。。。
是不是觉得很郁闷啊,想想应该是因为引用的时候是根据页面的方法和返回值来自动生成代理的,在没有加Test2方法之前在客户端是没有User这个代理类的,所以才会出现那个错误。但是随便加了一个这样的方法后,更新了客户端的代理已经自动添加了User代理类之后就没有问题了。