zoukankan      html  css  js  c++  java
  • 快速搭建基于ServiceStack框架的web服务

    ServiceStack是一个高性能的.NET Web Service 平台,能够简化开发高性能的REST (支持JSON,XML,JSV,HTML,MsgPack,ProtoBuf,CSV等消息格式)以及WCF SOAP风格的WebService。在内部实现上ServiceStack建立在原生的ASP.NET IHttpHandler之上,允许在.NET Framework和Mono之上。

    本文针对ServiceStack框架在.NET程序中的使用做简单介绍。

    1.新建.net 4.5的web 空项目,然后用nuget命令来安装ServiceStack

    Install-Package ServiceStack -Version 5.0.2

    或者直接安装最新版本:

    Install-Package ServiceStack

    (.net版本必须大于等于4.5版本,4.0项目会安装不成功)

    2.在工程中新建model和service文件夹

    创建请求和响应实体

    namespace UserService.ServiceModel
    {
      #region 请求实体
      [Route("/GetByNameUserInfo","Get,Post")]
      /// <summary>
      /// 通过姓名获取资料
      /// </summary>
      public class GetUserInfoByNameRequest : IReturn<UserInfo>
      {
        public string Name { get; set; }
      }
      #endregion
      //定义实体类   public class UserInfo   {     public string Name { get; set; }     public int Age { get; set; }     public string Phone { get; set; }   } }

    (因为ServiceStack是基于请求参数来定义请求路由的,所以关键的是请求参数一定要定义好,同时可以在请求参数上自定义路由名和请求方式,作为对外接口名。)

    3.在service文件夹创建服务接口

    namespace UserService.ServiceInterface
    {
      /// <summary>
      /// 接口
      /// </summary>
      public interface IUserInfoService
      {
        UserInfo Post(GetUserInfoByNameRequest request);
      }
    
      /// <summary>
      /// 实现接口
      /// </summary>
      public class UserInfoService : ServiceStack.Service,IUserInfoService
      {
        static UserInfoService()
        {
          //构造方法,可以用来实现数据库连接操作
        }
        //实现服务接口
        public UserInfo Post(GetUserInfoByNameRequest request)
        {
          UserInfo userInfo = new UserInfo();
          return userInfo;     }   } }

    4:新建全局应用程序类命名 Global.asax 到本项目(初始化服务)

    public class Global : System.Web.HttpApplication
    {
      public class MyAppHost : ServiceStack.AppHostBase
      {
        // 基础构造函数需要一个名称和程序集,其中包含Web服务实现(自己定义的服务接口)
        public MyAppHost()
          : base("UserService.ServiceInterface", typeof(ServiceInterface.UserInfoService).Assembly) 
        {}
        public override void Configure(Funq.Container container)
        {
          // 此方法应初始化Web服务类使用的任何IoC资源。
        }
      }
      protected void Application_Start(object sender, EventArgs e)
      {
        new AppHost().Init();
      }
    }

    或者单独创建AppHost.cs和Global.asax,内容分别为:

    public class AppHost : AppHostBase
    {
      /// <summary>
      /// 基础构造函数需要一个名称和程序集,其中包含Web服务实现(自己定义的服务接口)
      /// </summary>
      public AppHost()
        : base("UserService.ServiceInterface", typeof(ServiceInterface.UserInfoService).Assembly)
      {}
      /// <summary>
      /// Application specific configuration
      /// 此方法应初始化Web服务类使用的任何IoC资源。
      /// </summary>
      public override void Configure(Container container)
      {
      }
    }
    public class Global : System.Web.HttpApplication
    {
      protected void Application_Start(object sender, EventArgs e)
      {
        new AppHost().Init();
      }
    }

    5:修改web.config配置,新增system.webServer节点

    <configuration> 
      <!--必须添加下面配置-->
      <!--Required for IIS 7 (and above) -->
      <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
        <handlers>
          <add path="*.aspx" name="DefaultHttpApplication" type="System.Web.UI.PageHandlerFactory" verb="*" />
          <add path="*" name="ServiceStack.Factory" type="ServiceStack.HttpHandlerFactory, ServiceStack" verb="*" preCondition="integratedMode" resourceType="Unspecified" allowPathInfo="true" />
        </handlers>
      </system.webServer>
    </configuration>

    6.结果展示

    直接在Visual Studio中点击调试,或者将站点发布在IIS中,运行后可以看到如下界面,至此一个简单的基于ServiceStack框架的web服务就创建完成了:

    7.其他说明

    ServiceStack中的服务方法名为Any,Get以及Post,这也是ServiceStack支持的请求类型,Any表示服务可以通过HTTP Get和HTTP Post两种方式调用。这强化和简化了RESTFull风格的WebService的实现。只需要在这些方法上添加[Route(…)]属性即可。

    在get请求参数后面加上format参数可以返回响应的类型,例如:format=json、format=xml等。

    免费的ServiceStack服务最多包含10个接口,并且每小时的访问次数被限制在6000此以内。(当前版本为5.4.0)

    ServiceStack调用服务接口的示例:

    http://127.0.0.1:8033/json/reply/GetUserInfoByNameRequest

    8.开发遇到的问题

    ServiceStack搭建过程中的问题:在HTML页面中不能获得返回值,此时需要设置请求头。可以直接在web.config中设置,或者部署站点时在IIS中设置三个请求头。

    <httpProtocol>
        <customHeaders>
            <add name="Access-Control-Allow-Origin" value="*" />
            <add name="Access-Control-Allow-Headers" value="Content-Type" />
            <add name="Access-Control-Allow-Methods" value="POST, GET, PUT, DELETE, OPTIONS" />
        </customHeaders>
    </httpProtocol>

    原文地址:https://www.cnblogs.com/imdeveloper/p/10126874.html
    转载请注明出处,谢谢!

  • 相关阅读:
    bzoj 4012: [HNOI2015]开店
    POJ 1054 The Troublesome Frog
    POJ 3171 Cleaning Shifts
    POJ 3411 Paid Roads
    POJ 3045 Cow Acrobats
    POJ 1742 Coins
    POJ 3181 Dollar Dayz
    POJ 3040 Allowance
    POJ 3666 Making the Grade
    洛谷 P3657 [USACO17FEB]Why Did the Cow Cross the Road II P
  • 原文地址:https://www.cnblogs.com/imdeveloper/p/10126874.html
Copyright © 2011-2022 走看看