你是否覺得.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版本不同導致。提醒注意。

 

代碼下載:http://files.cnblogs.com/tyb1222/SpringWebService.rar 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM