1. 返回自定义class,但实际返回的倒是DataSet,即便实现了IxmlSerializable。
自定义了一个
class
,因为
WebService
须要对
class
进行
xml
序列化,因此实现了
IxmlSerializable
接口,可是在客户端调用调试的时候,却发现服务返回值不是自定义的
class
,而是一个
dataset
或者
dataset[]
。通过检验,致使如此结果发现仍是在序列化的过程当中出现了问题。在实现
IxmlSerializable
的时候,使用
XmlWriter
进行
tree
结构的序列化,而后使用
XmlReader
进行反序列化,
CLR
会把这个
tree
结构认为是
DataSet
序列化的结果,因此在反序列化的时候
.CLR
会把反序列化的结果转为
DataSet
。
若是要用
IxmlSerializable
实现自定义
class
的返回,最好使用
xml
架构文件进行验证,这样就能够实现返回的是一个
class
而不是
DataSet(
该例子能够在
msdn
上找到
)
。
2. 没法返回自定义class,即便对class申明了[Serializable]。
因为使用
IxmlSerializable
进行返回自定义
class
会比较麻烦,因此改用了
[Serializable]
进行实现。可是在实际中依然没法返回
class
。怎么回事呢?后来才发现,漏写了一个无参构造函数。在
.NET
开发
Web Service
中,序列化机制须要调用一个无参构造函数来序列化和反序列化对象,并且这个无参构造函数最好显式声明。记得在
.NET1.1
下的时候,没有显式申明无参构造函数的时候会出现异常提示,可是在
.NET2.0
之后却没有了。
在显示声明无参构造函数后,能够返回自定义
class
了,可是有些
public
属性依然没法进行序列化。怎么回事呢?原来对于只有
get
功能的属性,
.NET
的
[Serializable]Attribute
的序列化机制依然没法对之进行序列化
。可是在实际状况中,
class
的一些字段只能是
get
不能是
set
,该如何解决?
3. 序列化只有get功能的public property
对于只有
get
功能的
public property
,解决的最简单的方法就是定义个
set
空实现。即
public string Air
{
get{retrun _air;}
set{}
}
4. 没法进行远程调试。
在默认状况下,
VS05
之后上开发的
Web Servcie
默认状况下是不支持远程调试的。在调试页面上会显示以下信息:
对于该问题,只须要在
Web.config
文件中的
<system.web>
节点下加入以下信息:
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
<add name="HttpSoap"/>
<add name="Documentation"/>
</protocols>
</webServices>
其中的
<
protocols >
节点指定了
ASP.NET Web
服务可用来接收从客户端发送来的请求数据和返回响应数据的协议。
5.部署的时候出现"服务器应用程序不可用"
Web Service是用VS2008开发的,使用了LINQ TO XML和LINQ TO SQL,可是部署机子上是.NET2.0的环境,因此在服务器上装了.NET 3.5的Framework。测试的时候,却出现了“服务器应用程序不可用”。这个错误貌似在ASP.NET部署的时候常见问题。先使用 aspnet_regiis进行从新注册,可是错误依旧。后来,对虚拟目录指向的程序文件夹加入以下用户问题获得解决:
ASP.NET IIs_WPG Internet来宾账户 System