ASP.NET用.aspx文件来保存表示层代码,用code-behind文件中的类保存应用逻辑,.aspx与类代码文件各有分工;但web服务却不同,Web服务的逻辑完全是在code-behind的类中实现的。.asmx文件并没有什么真正的用途,实际上,这个文件既没有必要存在、也不应该存在。
在将WebServiceFactoryHandler类注册为响应*.asmx请求的HTTP Handler之后,开发人员就可以在IoC容器中用标准的Spring.NET对象定义来发布Web服务
先引用一段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、开发难度并未增加,图示说明: