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
    转载请注明出处,谢谢!

  • 相关阅读:
    Unity Notes调制粒子系统的颗粒的最大数目
    Swift编程语言学习2.1——基础运营商(在)
    JavaScript语言基础知识6
    算法题:合并两个有序列表
    DDFT
    Java For循环效率试验
    Delphi ORD
    Delphi TcxTreeList 节点添加图片
    SQL Server 除法 不起作用的问题
    Delphi 继承基类的窗体,并显示基类的控件操作。
  • 原文地址:https://www.cnblogs.com/imdeveloper/p/10126874.html
Copyright © 2011-2022 走看看