先引用一段spring.net framework帮助文档里的话:
“虽然目前.NET对web服务支持的非常好,Spring.NET认为还是有几个方面可以改进。
首先,.NET在.asmx文件中保存Web服务请求和服务对象的关联关系,这些.asmx文件不管有用没用都得放在那儿。
第二,Spring.NET希望能通过IoC容器对web服务进行依赖注入。一般说来web服务总会依赖其它服务对象,所以,如果能用配置方式来选择服务对象,这个功能就相当强大了。
最后,目前在.NET中Web服务的创建完全是一个实现(特定类型)的过程。多数服务(虽不能说是全部)都应实现为使用粗粒度服务接口的普通类型,并且,某个对象能否发布为远程对象、web服务还是企业(COM+)组件应该只与配置有关,而不应该取决于它的实现方式。
ASP.NET用.aspx文件来保存表示层代码,用code-behind文件中的类保存应用逻辑,.aspx与类代码文件各有分工;但web服务却不同,Web服务的逻辑完全是在code-behind的类中实现的。.asmx文件并没有什么真正的用途,实际上,这个文件既没有必要存在、也不应该存在。
在将WebServiceFactoryHandler类注册为响应*.asmx请求的HTTP Handler之后,开发人员就可以在IoC容器中用标准的Spring.NET对象定义来发布Web服务。
◆欧克,意思说得很明白,在web.config中注册一个httpHandlers节,以接管.asmx请求:
web.config
< httpHandlers >
< add verb ="*" path ="*.asmx" type ="Spring.Web.Services.WebServiceHandlerFactory, Spring.Web" />
</ httpHandlers >
◆既然不存在也不需要物理文件.asmx了,那就需要使用web services代理,来模拟.asmx页,这就是Spring.Web.Services.WebServiceExporter类的工作,它能显式导出web services。
举例说明一下:现有一个web services——SongSrvService(是一个类),它有一个方法GetSongUrl,用以获取一首曲子的地址,如果要把它导出为web services,应为此建立一个配置,并在spring.net环境中加载它:
servicesConfig.xml
<? xml version="1.0" encoding="utf-8" ?>
< objects xmlns ="http://www.springframework.net"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="http://www.springframework.net http://www.springframework.net/xsd/spring-objects.xsd"
>
<!-- web services -->
< object id ="SongSrvService" type ="woodigg.bll.Services.SongServices, woodigg.bll" >
< property name ="Message" value ="Test Message" />
< property name ="SongDaoSpring" ref ="SongDaoSpring" />
</ object >
<!-- 代理对象 -->
< object id ="SongSrv" type ="Spring.Web.Services.WebServiceExporter, Spring.Web" >
< property name ="TargetName" value ="SongSrvService" />
< property name ="Namespace" value ="http://haphere.com/" />
< property name ="Description" value ="My exported HelloWorld web service" />
< property name ="Name" value ="My exported HelloWorld web service" />
< property name ="MemberAttributes" >
< dictionary >
< entry key ="GetSongUrl" >
< object type ="System.Web.Services.WebMethodAttribute, System.Web.Services" >
< property name ="Description" value ="My Spring-configured HelloWorld method." />
</ object >
</ entry >
</ dictionary >
</ property >
</ object >
</ objects >
web.config
<!-- Spirng.Net 配置 -->
< spring >
< context >
< resource uri ="~/config/serviceConfig.xml" />
</ context >
< objects xmlns ="http://www.springframework.net" />
</ spring >
这里,看一下services运行的截屏:
可以看到,在WebServiceExporter导出类配置的节信息,都会忠实地显示在services描述中。如Description(描述)、MemberAttributes(方法描述)等。
◆欧克,回溯一步,我们来看看这个被代理导出的web services实现类,应该是什么样子?
在spring.net 1.1.0.2中,如果要让一个类被显式导出为web services,那么,它首先应该是实现某个接口的,意即——它的功能,全在一个接口被描述过。
在bll层新建一个SongServices类,其中包括一个services接口和一个实现类:
SongServices.cs
using System;
using System.Web;
using System.Collections;
using woodigg.model;
using woodigg.Interface.DAO;
namespace woodigg.bll.Services
{
public interface ISongServices
{
string GetSongUrl( int id);
}
public class SongServices : ISongServices
{
/// <summary>
/// 注入的工具类
/// </summary>
private ISongDAO _SongDaoSpring;
public ISongDAO SongDaoSpring
{
get { return _SongDaoSpring; }
set { _SongDaoSpring = value; }
}
private string message;
public string Message
{
set { message = value; }
}
public SongServices() { }
/// <summary>
/// web services之GetSongUrl
/// </summary>
/// <param name="id"> song id </param>
/// <returns> url </returns>
public string GetSongUrl( int id)
{
SONG sg = SongDaoSpring.LoadFromId(id);
if (sg != null )
return woodigg.DAO.Tool.ParameterFactory.WebUploadMusicDomain + sg.Url.ToString();
else
return string .Empty;
}
}
}
欧克,这就是Spring.net建议的web services管理方式。小结一下:
1、这种方式,省掉了一个.asmx页面;
2、整合了其他的spring.net下的对象,如方便了注入、拦截;
3、开发难度并未增加,图示说明: