你是否觉得.Net Web Service 中asmx文件是多余的?

用.Net开发 WebService一般都会先添加一个.asmx文件,然后在其.cs文件里将类标记上WebService,WebMethod等特性来构建WebService。是否想过.asmx文件是多余的呢。?
其实.asmx即不像aspx一样用作UI,又不像.handler文件一样处理业务逻辑,它的存在就是多余。
使用Spring.Net构建WebService完全可以不需要.asmx文件,直接通过它的IoC容器将它注入到对外提供服务的类中即可。
本文将带你走进一个没有.asmx文件的WebService。

 

目录:
  • 创建不依赖于asmx文件的WebService 
  • 通过Spring.Net提供WebService服务 
 

 

了解本机,需要对Spring.Net有一些基本的认识。我大致说说它的作用:

1、可以作用一种IoC(或者说的DI)的容器实现程序的解耦。

2、使用面前方面编程(AOP)的框架
3、对不同事务之间的处理可以使用同一的管理方式
4、提供验证框架用来做验证
如怎样配置Spring.Net。如果你对Spring.Net不够了解,请参见;http://www.cnblogs.com/tyb1222/category/270053.html
1、创建不依赖于asmx文件的WebService
首先通过Spring.Net创建不依赖具体asmx文件的Web Service .添加一个原始WebService的文件,只是通过Spring.Net的配置完成对具体文件的无依赖性。
    
      public class HelloWorldService : WebService 

    {
        //[WebMethod]
        public string HelloWorld(string str)
        {
            return "Hello World:    " + str;
        }

        [WebMethod]
        public Person GetPerson()
        {
            return new Person {Age = 25, Name = "zhansan"};
        }

        [WebMethod]
        public void SavePerson(Person person)
        {
            return;
        }
    }

配置如下图:

 

注意图中abstract=true,可以让Spring.Net避免创建多余的服务对象,Spring推荐这样做。
访问服务:
 

2、通过Spring.Net提供WebService服务

这种方式是本节叙述的重点。由于服务的松散耦合性,很多人都认为服务更适合使用接口进行规范。Spring.Net也是基于这一点来实现的。
首先我们定义服务接口(有点类似WCF中的服务契约,但无需标记ServiceContract等等任何标记)   接口定义:
    public interface IPerson
    {
        string SayHello(string name);
        int Add(int x, int y);
        void SavePerson(Person person);
        Person GetPerson(string name);
        string GetPersonString();
    }
服务实现没有什么特殊的地方,如下:
    public class PersonService : IPerson 

    {
        #region IPerson 成员

        public string SayHello(string name)
        {
            return "Hello word:    " + name;
        }

        public int Add(int x, int y)
        {
            return x + y;
        }

        public void SavePerson(Person person)
        {
            return;
        }

        public Person GetPerson(string name)
        {
            return new Person {Age = 25, Name = "zhangsan"};
        }

        public string GetPersonString()
        {
            return JsonConvert.SerializeObject(new Person {Age = 25, Name = "zhangsan"});
        }
        #endregion
    }

通过Spring.Net对服务进行配置:
<configuration> 

    <configSections>
        <sectionGroup name="spring">
            <section name="context" type="Spring.Context.Support.WebContextHandler, Spring.Web"/>
            <section name="objects" type="Spring.Context.Support.DefaultSectionHandler,Spring.Core"/>
        </sectionGroup>
    </configSections>

    <spring>
        <context>
            <resource uri="config://spring/objects"></resource>
        </context>
        <objects xmlns="http://www.springframework.net" xmlns:aop="http://www.springframework.net/aop">
            <object id="person" type="SpringWebServiceIoC.PersonService,SpringWebServiceIoC">
            </object>
            <object id ="personObj" type="SpringWebServiceIoCContract.Person,SpringWebServiceIoCContract"></object>
            <object id="PersonService" type="Spring.Web.Services.WebServiceExporter,Spring.Web">
                <property name="targetName" value="person"></property>
                <property name="MemberAttributes">
                    <dictionary>
                        <entry key="Add">
                            <object type="System.Web.Services.WebMethodAttribute, System.Web.Services">
                                <property name="Description" value="计算量整数之和"></property>
                                <property name="MessageName" value="计算"></property>
                            </object>
                        </entry>
                    </dictionary>
                </property>
            </object>
        </objects>
    </spring>
    
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
        <httpHandlers>        
            <add verb="*" path="*.asmx" type="Spring.Web.Services.WebServiceHandlerFactory, Spring.Web"/>
        </httpHandlers>
        <httpModules>
            <add name="SpringModule" type="Spring.Context.Support.WebSupportModule, Spring.Web"/>
        </httpModules>
    </system.web>

</configuration>

此种方式除了需要配置处理amsx文件的Handler之外,还需配置httpModules模块,通过它来讲请求转发给Handler。
 
访问服务: 

注意:使用Spring.NEt实现WebService时,在3.5平台上开发的服务能正常运行在4.0上有可能会有如下异常

 

但是在4.0上的服务,如果无参数又能正常运行。这通常是因为使用的Spring.Net版本不同导致。提醒注意。

 

代码下载:https://files.cnblogs.com/tyb1222/SpringWebService.rar 

posted @ 2012-06-05 22:36  tyb1222  阅读(11637)  评论(7编辑  收藏  举报