ServiceStack Web Service 创建与调用简单示列

上篇文章介绍了ServiceStack是什么,本章进入主题,如何快速简单的搭建ServiceStack服务环境和调用。

ServiceStack服务搭建

服务的搭建有两种方法,我会一一介绍。

第一种方法如下:

1.创建网站项目

2.安装发布组件

packages.confing文件为您提供每一个ServiceStack dll 的版本和运行时信息。

定义是 ServiceStack <Ticket> 请求数据契约

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ServiceStack;

namespace Model
{
    /// <summary>
    /// 创建票据 请求实体
    /// </summary>
    public class TicketRequest : IReturn<TicketResponse>
    {
        public int TicketId { get; set; }
        public int TableNumber { get; set; }
        public int ServerId { get; set; }
    }
    public class TicketDeleteRequest
    {
        public int TicketId { get; set; }
    }
}

定义ServiceStack <Ticket> 响应数据契约

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Model
{
    /// <summary>
    /// 创建票据响应数据实体
    /// </summary>
    public class TicketResponse
    { 
        public int TicketId { get; set; }
        public int TableNumber { get; set; }
        public int ServerId { get; set; }
        public List<OrderResponse> Orders { get; set; }
        public DateTime Timestamp { get; set; }
    }
    /// <summary>
    /// 票据所属订单
    /// </summary>
    public class OrderResponse
    {
        public int OrderId { get; set; }
    }
}

定义ServiceStack 接口方法

using Model;
using System.Collections.Generic;

namespace Interface
{
    public interface ITicketService
    {
        /// <summary>
        /// 方法请求模式和路由规则 后面再说
        /// 请求票据列表
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        List<TicketResponse> Any(TicketRequest request);
        /// <summary>
        /// 删除指定票据
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        bool POST(TicketDeleteRequest deleteid);
    }
}

实现ServiceStack 接口方法

using Interface;
using Model;
using System;
using System.Collections.Generic;

namespace Service
{
    public class TicketService : ServiceStack.Service, ITicketService
    {
        /// <summary>
        /// 方法请求模式和路由规则 后面再说
        /// 请求票据列表
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public List<TicketResponse> Any(TicketRequest request)
        {
            List<TicketResponse> result = new List<TicketResponse>();
            List<OrderResponse> orderlist = new List<OrderResponse>();
            orderlist.Add(new OrderResponse() { OrderId = 1 });
            result.Add(new TicketResponse()
            {
                Orders = orderlist,
                ServerId = 1,
                TableNumber = 1,
                TicketId = 1,
                Timestamp = DateTime.Now
            });
            result.Add(new TicketResponse()
            {
                Orders = orderlist,
                ServerId = 2,
                TableNumber = 2,
                TicketId = 2,
                Timestamp = DateTime.Now
            });

            return result;
        }
        /// <summary>
        /// 删除指定票据
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public bool POST(TicketDeleteRequest deleteid)
        {
            return true;
        }
    }
}

实现ServiceStack服务宿主

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Service.Host
{
    public class TickServiceHost : ServiceStack.AppHostBase
    {
        // Register your Web service with ServiceStack.
        public TickServiceHost()
            : base("Ticket Service", typeof(Service.TicketService).Assembly) { }
        public override void Configure(Funq.Container container)
        {
            // Register any dependencies your services use here.
        }
    }
}

启动ServiceStack服务宿主

<%@ Application Language="C#" %>

<script runat="server">

    void Application_Start(object sender, EventArgs e) 
    {
        // 在应用程序启动时运行的代码
        new Service.Host.TickServiceHost().Init();
    }
    
    void Application_End(object sender, EventArgs e) 
    {
        //  在应用程序关闭时运行的代码

    }
        
    void Application_Error(object sender, EventArgs e) 
    { 
        // 在出现未处理的错误时运行的代码

    }

    void Session_Start(object sender, EventArgs e) 
    {
        // 在新会话启动时运行的代码

    }

    void Session_End(object sender, EventArgs e) 
    {
        // 在会话结束时运行的代码。 
        // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
        // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
        // 或 SQLServer,则不引发该事件。

    }
       
</script>

添加ServiceStack网站集成配置

<?xml version="1.0" encoding="utf-8"?>

<!--
  有关如何配置 ASP.NET 应用程序的详细信息,请访问
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->

<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <!--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>

至此ServiceStack服务已经完成,运行程序可以看到界面如下,其中TicketRequest和TicketDeleteRequest可以理解成实际的调用方法,里面定义的参数可以理解成方法的请求参数,后续调用会继续讲解

整个项目解决方案的框架如下:

第二种创建方法比较简单,快速,利用ServiceStack官方提供的模板直接生成,具体操作方法如下:

1.打开VS,工具扩展和更新

2.搜索servicestack提供的组件

3.安装完成后创建新项目,来自模板

创建完成后的项目框架如下

5.改成我们所需要的

 ServiceStack客户端调用

using ConsoleApplication1.model;
using ServiceStack;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //客户端采用json数据格式
            JsonServiceClient client1 = new JsonServiceClient("http://localhost:32617/");
            Console.WriteLine("http://localhost:32617/");
            //TicketRequest 为请求的方法
            List<TicketResponse> responseSearch = client1.Get<List<TicketResponse>>(new TicketRequest() { TicketId = 1 });
            Console.WriteLine(responseSearch.Count);

            bool responseDelete = client1.Post<bool>(new TicketDeleteRequest() { TicketId = 1 });
            Console.WriteLine(responseDelete);

            Console.WriteLine("http://localhost:36107/");

            List<TicketResponse> responseSearch1 = client1.Get<List<TicketResponse>>(new TicketRequest() { TicketId = 1 });
            Console.WriteLine(responseSearch1.Count);

            bool responseDelete1 = client1.Post<bool>(new TicketDeleteRequest() { TicketId = 1 });
            Console.WriteLine(responseDelete1); 
              
            Console.ReadLine();
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1.model
{
    /// <summary>
    /// 创建票据 请求实体
    /// IReturn<TicketResponse> 指该方法返回的数据实体
    /// </summary>
    public class TicketRequest
    {
        public int TicketId { get; set; }
        public int TableNumber { get; set; }
        public int ServerId { get; set; }
    }
    public class TicketDeleteRequest
    {
        public int TicketId { get; set; }
    }
}

浏览器端调用:

 

请求URL如下:

浏览器输入http://localhost:36107/json/reply/TicketRequest?TicketId=1

浏览器默认请求为GET,如果方法定义POST请求类型,可以采用第三方模拟Rest请求工具

 

参考: 

https://servicestack.net/features

https://msdn.microsoft.com/zh-cn/magazine/dn342871.aspx

http://www.cnblogs.com/shanyou/p/3348347.html

http://www.cnblogs.com/yangecnu/p/Introduce-ServiceStack.html

posted @ 2017-05-25 17:22  龙腾飞  阅读(374)  评论(0编辑  收藏  举报