zoukankan      html  css  js  c++  java
  • 你是否觉得.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 

  • 相关阅读:
    20169207 2016-2017-2 《移动平台应用开发实践》第五周学习总结
    20169212 2016-2017-2《网络攻防实践》第八周学习总结
    20169212 2016-2017-2 《网络攻防实践》第七周学习总结
    20169212 2016-2017-2 《网络攻防实践》第六周学习总结
    20169212 2016-2017-2 《网络攻防实践》第五周学习总结
    20169212 2016-2017-2 《网络攻防实践》第四周学习总结
    20169212 2016-2017-2 《网络攻防实践》第三周学习总结
    20169212 2016-2017-2 《网络攻防实践》第二周学习总结
    20169212《网络攻防实践》第一周学习总结
    20169212《Linux内核原理与分析》课程总结
  • 原文地址:https://www.cnblogs.com/tyb1222/p/2537395.html
Copyright © 2011-2022 走看看