WebService总结2(2017/12/03)

2017-12-03  本文已影响0人  文袁

纲要(以某普查子系统的接口为例)

  1. 基本使用工具和需求目的(CRUD)
  2. 传参方式(URL,HEADERS)
  3. 整体流程

1. 基本使用工具和需求目的

2. 传参方式

http://localhost:29800/ZXPCZXT.asmx/SetValid?cid=1&isvalid=0

3. 总体流程

3.1. 基础配置

<connectionStrings>
    <clear />
    <add providerName="System.Data.OracleClient" name="Northwind" connectionString="Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=#########)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl))); User Id=#####;Password=####;" />
  </connectionStrings>

//在<system.web></system.web>中添加远程访问协议
 <webServices>
      <protocols>
        <add name="HttpSoap" />
        <add name="HttpPost" />
        <add name="HttpGet" />
        <add name="Documentation" />
      </protocols>
    </webServices>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Collections.Specialized;
using System.Net;
using System.Text;
using System.IO;
using System.Reflection;

/// <summary>
/// BaseService 的摘要说明
/// </summary>
public class BaseService : System.Web.Services.WebService
{
    /// <summary>
    /// 解析HTTP GET/POST方法传入的参数,并转化成指定类型
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="key"></param>
    /// <param name="defaultValue"></param>
    /// <returns></returns>
    public T ParseField<T>(string key, T defaultValue)
    {
        try
        {
            NameValueCollection paras = this.Context.Request.Params;
            string value = paras[key];
            if (null == value)
            {
                return defaultValue;
            }
            return (T)Convert.ChangeType(value, typeof(T));
        }
        catch
        {
            return defaultValue;
        }
    }

    public static object ChangeType(object value, Type conversion)
    {
        var t = conversion;

        if (t.IsGenericType && t.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
        {
            if (value == null)
            {
                return null;
            }

            t = Nullable.GetUnderlyingType(t);
        }

        return Convert.ChangeType(value, t);
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// HeadData 的摘要说明
/// 返回操作的状态
/// </summary>
public class HeadData
{
    /// <summary>
    /// 一个返回值,0表示成功
    /// </summary>
    public int Code { get; set; }


    /// <summary>
    /// 错误的信息
    /// </summary>
    private string mMsg = "";

    /// <summary>
    /// 错误信息
    /// </summary>
    public string Msg { get { return mMsg; } set { mMsg = value; } }



    private DateTime mServerTime = DateTime.Now;
    /// <summary>
    /// 返回服务器时间
    /// </summary>
    public DateTime ServerTime { get { return mServerTime; } set { mServerTime = value; } }

    /// <summary>
    /// 返回结果的数量
    /// </summary>
    public int Count { get; set; }



    /// <summary>
    /// 业务逻辑处理结果
    /// </summary>
    public bool Result { get; set; }
}

public enum codetype
{
    /// <summary>
    /// 执行成功
    /// </summary>
    CODE_OK = 0,

    /// <summary>
    /// 执行失败
    /// </summary>
    CODE_ERROR = 1
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Converters;

/// <summary>
/// ReturnType 的摘要说明
/// </summary>
public class ReturnType
{
    /// <summary>
    /// 返回JSON格式的字符串
    /// </summary>
    /// <param name="Resp"></param>
    /// <param name="head"></param>
    /// <param name="data"></param>
    public static void Json(HttpResponse Resp, HeadData head, object data)
    {
        if (string.IsNullOrEmpty(Resp.ContentType))
        {
            Resp.ContentType = "text/json";
        }
        object objData = new
        {
            Code = head.Code,
            Errmsg = head.Msg,
            ServerTime = head.ServerTime,
            Result = head.Result,
            Count = head.Count,
            Data = data
        };

        IsoDateTimeConverter timeFormat = new IsoDateTimeConverter();
        timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
        IList<JsonConverter> converts = new List<JsonConverter>();
        converts.Add(timeFormat);

        Resp.Write(JsonConvert.SerializeObject(objData, Newtonsoft.Json.Formatting.None,
                             new JsonSerializerSettings()
                             {
                                 ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
                                 ContractResolver = new CamelCasePropertyNamesContractResolver(),
                                 Converters = converts
                             }));
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

/// <summary>
/// ResultOutput 的摘要说明
/// 以JSON格式输出结果集
/// </summary>
public class ResultOutput : System.Web.Services.WebService
{
    /// <summary>
    /// 以JSON格式输出结果集
    /// </summary>
    /// <param name="codetype"></param>
    /// <param name="result"></param>
    /// <param name="count"></param>
    /// <param name="Msg"></param>
    /// <param name="data"></param>
   public void Output(int codetype,bool result,int count,string Msg,object data)
    {
        HeadData hd = new HeadData();
        HttpResponse Response = Context.Response;
        hd.Code = codetype;
        hd.Result = result;
        hd.Count = count;
        hd.Msg = Msg;
        ReturnType.Json(Response, hd,data);

    }
}

3.2. Elinq ORM 配置

using NLite.Data;

/// <summary>
/// PCTREEMODEL 的摘要说明
/// 普查内容
/// </summary>
[Table("PC_TREE")]
public class PCTREEMODEL
{
    /// <summary>
    /// 主键,自增长
    /// </summary>
    [Id(SequenceName = "seq_pc_tree", IsDbGenerated =true)]
    public int CID { get; set; }

    /// <summary>
    /// 父ID
    /// </summary>
    public int PID { get; set; }

    /// <summary>
    /// 名称
    /// </summary>
    public string CNAME { get; set; }

    /// <summary>
    /// 排序
    /// </summary>
    public int CSORT { get; set; }

    /// <summary>
    /// 是否有效
    /// </summary>
    public int ISVALID { get; set; }

    /// <summary>
    /// 备注
    /// </summary>
    public string REMARK { get; set; }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NLite;
using NLite.Data;

/// <summary>
/// SsisDbContext 的摘要说明
/// 连接到数据库,并能同步对表的增删改查操作。
/// </summary>
public class SsisDbContext : DbContext
{
    const string CONNECTIONNAME = "Northwind";
    //连接数据库,设置sql语句输出日志,注册实体到数据表的映射关系
    static NLite.Data.DbConfiguration dbConfig = NLite.Data.DbConfiguration.Configure(CONNECTIONNAME)
        .SetSqlLogger(() => new SqlLog(Console.Out))
        .AddClass<PCTREEMODEL>()
        .AddClass<PCINFOMODEL>(m =>
        {
            m.OneToOne<PCTREEMODEL>(e => e.PCTREE).ThisKey(e => e.cid).OtherKey(e => e.CID);
            m.OneToOne<PCFWMODEL>(e => e.PCFW).ThisKey(e => e.fwid).OtherKey(e => e.fwid);
        })
        .AddClass<PCFWMODEL>();  
    public SsisDbContext() : base(dbConfig)
    {
        //
        // TODO: 在此处添加构造函数逻辑
        //
    }

    //表示用于执行插入、读取、更新和删除操作的类型化实体集,对实体集中所有的增删改查的操作会立即同步到数据库对应的表中
    public readonly IDbSet<PCTREEMODEL> PCTREE;
    public readonly IDbSet<PCINFOMODEL> PCINFO;
    public readonly IDbSet<PCFWMODEL> PCFW;
}

值得注意的是,在注册实体到数据表的映射关系时,要先理清表与表之间的关系,是一对一,还是一对多,或者多对一,Elinq不支持多对多,需要转换成两个一对多映射。然后通过ThisKey 和 ThatKey建立关联。

映射关系理解示例:

一对一:第一种是一对一主键关联,要求两个主键必须完全一致;第二种是一对一外键关联(未懂)。例子,一个球队对应一个地址。

一对多:例如,从球队角度来说,一个球队拥有多个球员

多对一:例如,从球员角度来说,多个球员属于一个球队

多对多:如学生与选修课之间的关系,一个学生可以选择多门选修课,每门选修课又可以被多名学生选择。一般是采用中间表的方式处理,转化为两个一对多。

3.3. 增删改查

1.区分非数据库操作和数据库操作,例如,对入参是否为空的验证是非数据库型的操作,切记不能放到连接数据库再验证,避免人为增加计算性能的损耗。

2.务必结合实际应用场景编写接口的功能,避免写出的接口功能完全不切合生活应用,脱离实际。在不清楚实际应用场景时,浏览对应的生活场景中的网站,通过F12查看别人的需求细节设计。

3.尽量精简自己的代码,能一句代码实现功能,就不要使用两句三句甚至更多的代码,避免冗余和计算性能浪费。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NLite.Data;

namespace Example.Entities
{
    [Table(Name ="customers")]
    public class Customer
    {
        /// <summary>
        ///用户id
        /// </summary>
        [Id]
        public string id { get; set; }

        /// <summary>
        /// 用户名字
        /// </summary>
        public string CUSTOMERNAME { get; set; }

        /// <summary>
        /// 用户信息
        /// </summary>
        public string CUSTOMERINFORMATION { get; set; }

        public IList<order> orders { get; set; }
    }
}
   //判断传参是否完整
        if (string.IsNullOrEmpty(cids) || string.IsNullOrEmpty(csorts))         
        {
            resout.Output((int)codetype.CODE_ERROR,false,0,"参数不足",null);
            Response.End();
        }

2.后台生成全局唯一的ID,而不是前端传入,这仅仅是后台的工作。

customer.id = Guid.NewGuid().ToString();
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

/// <summary>
/// ZXPCZXT 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 
// [System.Web.Script.Services.ScriptService]
public class ZXPCZXT : BaseService
{





    [WebMethod(Description = "插入或更新")]
    public void InsertOrUpdate()
    {
        HeadData hd = new HeadData();
        HttpResponse Response = Context.Response;  //响应体
        ResultOutput resout = new ResultOutput();

        try
        {
            //解析HTTP GET方法传入的参数,并转换为指定类型
            string cname = ParseField("cname", string.Empty);
            string remark = ParseField("remark", string.Empty);
            int cid = ParseField("cid", -1);
            int pid = ParseField("pid", -1);
            int isvalid = ParseField("isvalid", -1);
                        
            if ( cid == -1)   //判断必要的主键是否传入
            {                
                resout.Output((int)codetype.CODE_ERROR,false,0, "参数不足",null);
                Response.End();
            }          
            using (SsisDbContext db = new SsisDbContext())   //连接数据库
            {
                int count = db.PCTREE.Where(c => c.CID == cid).Count();               
                if (count > 0)     //若count 大于0,进行更新操作,反之,进行插入操作
                {
                    int num = db.PCTREE.Update(new { cname = cname,remark = remark} ,(p => p.CID == cid)); //更新                                             
                    if (num > 0)
                    {
                        resout.Output((int)codetype.CODE_OK, true, num, "更新成功", null);
                    }
                    else
                    {
                        resout.Output((int)codetype.CODE_ERROR, false, num, "更新失败", null);
                    }
                }
                else   //进行插入操作
                {                  
                    var list = db.PCTREE.OrderByDescending(c => c.CSORT).FirstOrDefault(); //查询CSORT值最大的对应记录
                    int MaxCsort = list.CSORT; 
                    var p = new PCTREEMODEL
                    {                         
                        PID = pid,
                        CNAME = cname,
                        CSORT = MaxCsort + 1 ,
                        ISVALID = isvalid,
                        REMARK = remark
                    };                   
                    int num = db.PCTREE.Insert(p);  //插入新记录                              
                    if (num > 0)
                    {
                        resout.Output((int)codetype.CODE_OK, true, num, "插入成功", null);
                    }
                    else
                    {
                        resout.Output((int)codetype.CODE_ERROR, false, num, "插入失败", null);
                    }
                }
            }
        }
        catch (System.Threading.ThreadAbortException) { } //捕捉中止线程的异常
        catch (Exception ex)
        {
            resout.Output((int)codetype.CODE_ERROR, false, 0, ex.ToString(), null);
        }        
    }




    [WebMethod(Description = "设置禁用或启用")]
    public void SetValid()
    {
        HeadData hd = new HeadData();
        HttpResponse Response = Context.Response; //响应体     
        ResultOutput resout = new ResultOutput();   
        int cid = ParseField("cid", -1);    //解析http get方法传入的参数,并转化为指定类型
        int isvalid = ParseField("isvalid", -1);       
        if (cid == -1 || isvalid == -1)    //判断传参是否完整
        {           
            resout.Output((int)codetype.CODE_ERROR, false, 0, "参数不足", null);
            Response.End();
        }
        if (isvalid != 1 && isvalid != 0)
        {
            resout.Output((int)codetype.CODE_ERROR, false, 0, "禁用或启用失败,请重新传入isvalid的值,其中默认1为启用,0为禁用", null);
            Response.End();
        }
        try
        {
            using(SsisDbContext db = new SsisDbContext()) //连接数据库
            {
                int count = db.PCTREE.Where(p => p.CID == cid).Count(); //通过主键查询记录数量
                if (count >0)
                {                   
                    int sum = db.PCTREE.Update(new { isvalid = isvalid},(p => p.CID == cid || p.PID == cid)); //更新对应isvalid的值
                    hd.Count = sum;                    
                    if (isvalid == 1 && sum > 0)  //通过判断isvalid的值,判别是启用还是禁用,默认1为启用,0为禁用
                    {                       
                        resout.Output((int)codetype.CODE_OK, true,sum, "启用成功", null);                                                                 
                    }
                    else if(isvalid == 0 && sum > 0 )
                    {                 
                        resout.Output((int)codetype.CODE_OK, true, sum, "禁用成功", null);                                               
                    }
                    else if(isvalid == 1 && sum <= 0)
                    {
                        resout.Output((int)codetype.CODE_ERROR, false, sum, "启用失败", null);                                        
                    }
                    else
                    {
                        resout.Output((int)codetype.CODE_ERROR, false, sum, "禁用失败", null);
                    }                  
                }
                else
                {                         
                    resout.Output((int)codetype.CODE_ERROR, false, count, "用户不存在", null);          
                }     
            }
        }
        catch (System.Threading.ThreadAbortException) { } //捕捉中止线程的异常
        catch (Exception ex)
        {
            resout.Output((int)codetype.CODE_ERROR, false, 0, ex.ToString(), null);
        }        
    }


    [WebMethod(Description = "保存排序结果")]
    public void SaveSort()
    {
        HeadData hd = new HeadData();
        HttpResponse Response = Context.Response; //响应体   
        ResultOutput resout = new ResultOutput();  
        string cids = ParseField("cids", string.Empty);    //解析HTTP GET方法传入的参数,并转化为指定类型
        string csorts = ParseField("csorts", string.Empty);
        if (string.IsNullOrEmpty(cids) || string.IsNullOrEmpty(csorts))            //判断传参是否完整
        {
            resout.Output((int)codetype.CODE_ERROR,false,0,"参数不足",null);
            Response.End();
        }        
        string[] cidArr = cids.Split(',');   //分割传入的字符串为字符串数组
        string[] csortArr = csorts.Split(',');
        try
        {
            using(SsisDbContext db = new SsisDbContext()) //连接数据库
            {
                int num = 0;
                //循环更新对应排序值
                for (int i = 0; i < cidArr.Count(); i++)
                {
                    num += db.PCTREE.Update(new { csort = Convert.ToInt32(csortArr[i]) }, (p => p.CID == Convert.ToInt32(cidArr[i])));
                }          
                if (num > 0)
                {
                    resout.Output((int)codetype.CODE_OK, true, num, "保存排序成功", null);
                }
                else
                {
                    resout.Output((int)codetype.CODE_ERROR, false, num, "保存排序失败", null);
                }
            }
        }
        catch (System.Threading.ThreadAbortException) { }  //捕捉中止线程的异常
        catch (Exception ex)
        {
            resout.Output((int)codetype.CODE_ERROR, false, 0, ex.ToString(), null);
        }
    }




    [WebMethod(Description = "###########")]
    public void Query()
    {
        HeadData hd = new HeadData();
        HttpResponse Response = Context.Response; //响应体    
        ResultOutput resout = new ResultOutput();   
        string s_time = ParseField("s_time", string.Empty);   //获取http get/post方法传入的参数,并转化为指定类型
        string e_time = ParseField("e_time", string.Empty);
        string fwids = ParseField("fwids", string.Empty);
        string cids = ParseField("cids", string.Empty);        
        int pageindex = ParseField("pageindex", -1) < 0 ? 1 : ParseField("pageindex", -1);  //判断页面索引和每页数量
        int pagesize = ParseField("pagesize", -1) < 0 ? 10 : ParseField("pagesize", -1);      
        if (!string.IsNullOrEmpty(s_time) && !string.IsNullOrEmpty(e_time))   //在非空的情况下判断终止时间是否大于起始时间
        {
            DateTime startdate = (Convert.ToDateTime(s_time)).Date;
            DateTime enddate = (Convert.ToDateTime(e_time)).Date;
            if (enddate < startdate)
            {               
                resout.Output((int)codetype.CODE_ERROR, false, 0, "查询失败,结束时间需要大于起始时间", null);
                Response.End();
            }
        }
        try
        {
            using(SsisDbContext db = new SsisDbContext())
            {
                //通过普查时间段,普查范围,问题,进行筛选查询
                IQueryable<PCINFOMODEL> list = db.PCINFO.Include(e => e.PCTREE).Include(e => e.PCFW); //     提供对数据类型已知的特定数据源的查询进行计算的功能 
                //起始时间
                if (!string.IsNullOrEmpty(s_time))
                {
                    DateTime startdate = (Convert.ToDateTime(s_time)).Date;
                    list = list.Where(c => c.pcsj >= startdate);
                }
                //终止时间
                if (!string.IsNullOrEmpty(e_time))
                {
                    DateTime enddate = (Convert.ToDateTime(e_time)).Date;
                    list = list.Where(c => c.pcsj <= enddate);
                }                          
                //范围名称
                if (!string.IsNullOrEmpty(fwids))
                {
                    //string[] fwmcArr = fwmc.Split(',');
                    //for (int i = 0; i < fwmcArr.Count() - 1; i++)
                    //{
                    //    list =  list.Where(c => c.PCFW.fwmc == fwmcArr[i]);
                    //    list = list.Union(list.Where(c => c.PCFW.fwmc == fwmcArr[i + 1]));
                    //     //var resultlist = list.Concat(list.Where(c => c.PCFW.fwmc == fwmcArr[i + 1]));
                    //   // resultlist = resultlist.Concat(list);
                    //}
                    //list = list.Where(c => fwmc.Contains(c.PCFW.fwmc));

                    list = list.Where(c => fwids.Split(',').Contains(c.PCFW.fwid.ToString()));                   
                }
                //普查问题名称
                if (!string.IsNullOrEmpty(cids))
                {
                    list = list.Where(c => cids.Split(',').Contains(c.PCTREE.CID.ToString()));
                }
                     
                var vlist = list.Select(c => new PCDetail()
                {
                    pcid = c.pcid,
                    pcsj = c.pcsj,
                    pcfw = c.PCFW.fwmc,
                    cname = c.PCTREE.CNAME
                }).OrderBy(c => c.pcsj).Skip(pageindex - 1).Take(pagesize).ToList(); //把查询结果序列的每个元素投影到新表中,并排序,去除指定索引前的记录,确定每页大小,最后转换为列表形式
                //int totalcount = list.Count();   ?? 报错,值过多。  可能原因:  由于是多表查询,必须先转换为list列表,然后才能计算记录个数。
                int num = list.ToList().Count();             //返回结果总数。                  
                if (num > 0)
                {                    
                    resout.Output((int)codetype.CODE_OK,true, num, "查询成功",vlist);
                }
                else
                {
                    resout.Output((int)codetype.CODE_ERROR,false, num, "满足条件的记录不存在",null);
                }
            }
        }
        catch (System.Threading.ThreadAbortException) { }  //捕捉中止线程的异常
        catch (Exception ex)
        {
            resout.Output((int)codetype.CODE_ERROR, false, 0, ex.ToString(), null);
        }
    }



    [WebMethod(Description = "通过关键词定位")]
    public void KeyQuery()
    {
        HeadData hd = new HeadData();       
        ResultOutput resout = new ResultOutput();
        string keyword = ParseField("keyword",string.Empty);   //解析HTTP GET方法传入的参数
        try
        {
            using(SsisDbContext db = new SsisDbContext()) //连接数据库
            {
                IQueryable<PCTREEMODEL> list = db.PCTREE;
                //根据关键词查询
                if (!string.IsNullOrEmpty(keyword))
                {
                    list = list.Where(c => c.CNAME.Contains(keyword));
                }
                var vlist = list.Select(c => new PCTREEOUT
                {
                    CID = c.CID,
                    PID = c.PID,
                    CNAME = c.CNAME,
                    CSORT = c.CSORT,
                    ISVALID = c.ISVALID,
                    REMARK = c.REMARK
                }).OrderBy(c =>c.CSORT).ToList(); //把查询的结果序列的每个元素投影到新表中,并排序,最后转换为列表   
                int num = list.Count();           //单表
                if (num > 0)
                {          
                    resout.Output((int)codetype.CODE_OK, true, num, "查询成功", vlist);
                }
                else
                {
                    resout.Output((int)codetype.CODE_ERROR, false, num, "未搜索到含关键词的记录", null);
                }

            }
        }
        catch (System.Threading.ThreadAbortException) { } //捕捉中止线程异常
        catch (Exception ex)
        {      
            resout.Output((int)codetype.CODE_ERROR, false, 0, ex.ToString(), null);
        }
    }


    [WebMethod(Description = "获取######结果集")]
    public void Get_PCTREE()
    {
        HeadData hd = new HeadData();
        //HttpResponse Response = Context.Response;
        ResultOutput resout = new ResultOutput();
        try
        {
            using (SsisDbContext db = new SsisDbContext())
            {
                var list = db.PCTREE.Select(c => new PCTREEOUT
                {
                    CID = c.CID,
                    PID = c.PID,
                    CNAME = c.CNAME,
                    CSORT = c.CSORT,
                    ISVALID = c.ISVALID,
                    REMARK = c.REMARK
                }).OrderBy(c => c.CSORT).ToList();

                int num = list.Count();
                if (num > 0)
                {
                    resout.Output((int)codetype.CODE_OK, true, num, "查询成功", list);
                }
                else
                {
                    resout.Output((int)codetype.CODE_ERROR, false, num, "查询失败", null);
                }
            }
        }
        catch (Exception ex)
        {
            resout.Output((int)codetype.CODE_ERROR, false, 0, ex.ToString(), null);

        }
    }


}

附相关数据查询的业务代码(加了TOKEN认证,分组遍历查询)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using MySql.Data.MySqlClient;
using NLite;
using NLite.Data;
using System.Text;
using System.Net;
using System.Collections.Specialized;


/// <summary>
/// QueryService 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 
// [System.Web.Script.Services.ScriptService]
public class QueryService : BaseService
{

    [WebMethod(Description = "用户登录")]
    public void UserLogin()
    {
        string usercode = ParseField("account", string.Empty); //解析http get/post 方法传入的参数,并转换为指定类型 
        string password = ParseField("password", string.Empty);

        HeadData hd = new HeadData();
        HttpResponse Response = Context.Response;
        ResultOutput resout = new ResultOutput();
        if (string.IsNullOrEmpty(usercode) || string.IsNullOrEmpty(password))  //判断传入参数是否为空
        {
            resout.Output_detailtime((int)codetype.CODE_ERROR, false, 0, "登录账号或者密码不能为空!", null);
            Response.End();
        }
        try
        {
            using(SsisDbContext db = new SsisDbContext())
            {
                var useraccount = db.account.FirstOrDefault(m => m.usercode == usercode); 
                if (useraccount == null) //判断账号是否存在
                {
                    resout.Output_detailtime((int)codetype.CODE_ERROR, false, 0, "登录的账号不存在", null);
                    Response.End();
                }
                if (string.Compare(password,useraccount.password,true) != 0)  //判断密码是否正确
                {
                    resout.Output_detailtime((int)codetype.CODE_ERROR, false, 0, "登录的密码不正确", null);
                    Response.End();
                }
                var systoken = new accounttoken_model(); //定义一条账户令牌的新记录
                systoken.userid = useraccount.userid;
                systoken.login = DateTime.Now;
                systoken.token = ###########; //加密令牌
                var usertoken = db.account_token.SingleOrDefault(s => s.token == systoken.token);  //判断令牌是否已存在,若存在,更新登录时间,若不存在,插入新令牌
                int num = 0;
                if (usertoken != null)
                {
                    usertoken.login = DateTime.Now;
                    num = db.account_token.Update(usertoken);
                }
                else
                {
                    num = db.account_token.Insert(systoken);
                }
                if (num > 0)
                {
                    resout.Output_detailtime((int)codetype.CODE_OK, true, num, "登录成功", systoken.token);
                }
                else
                {
                    resout.Output_detailtime((int)codetype.CODE_ERROR, false, 0, "登录失败", null);
                }                
            }
        }
        catch (System.Threading.ThreadAbortException) { }
        catch (Exception ex)
        {
            resout.Output_detailtime((int)codetype.CODE_ERROR, false, 0, ex.ToString(), null);
        }
    }

 
    [WebMethod(Description = "##############")]
    public void get_kqzl_aqi_hour()
    {
        //timeformat timeformat = new timeformat();
        HeadData hd = new HeadData();
        HttpResponse Response = Context.Response;
        ResultOutput resout = new ResultOutput();

        NameValueCollection paras = this.Context.Request.Headers;
        
        string newtoken = paras["token"];
     
        //string newtoken = ParseField("token", string.Empty); //token
        var validtoken = CommonFunction.GetValidToken(newtoken);
        if (!validtoken.RetResult)
        {
            resout.Output((int)codetype.CODE_ERROR, false, 0, "查询失败,请传入有效令牌", null);
            Response.End();
        }
    
        try
        {
            using (SsisDbContext db = new SsisDbContext()) //连接数据库
            {
               

                //List<kqzl_aqi_hour_out> vlist = db.kqzl_aqi_hour.Select(c => new kqzl_aqi_hour_out
                //{
                //    typename = c.typename               
                //}).Distinct().ToList();  //获取污染物名称

                //List<kqzl_aqi_hour_data_out> datalist = db.kqzl_aqi_hour.Select(c => new kqzl_aqi_hour_data_out
                //{
                //    typename = c.typename,
                //    day = c.day,
                //    hour = c.hour,
                //    amount = c.amount,
                //    color = c.color
                //}).OrderBy(c => c.hour).ToList();  //获取指定数据

                //vlist.ForEach(a => a.data = datalist.Where(e => e.typename == a.typename).ToList());  //遍历对应污染物的数据指标

                List<kqzl_aqi_hour_out> vlist =  new List<kqzl_aqi_hour_out>();
                db.kqzl_aqi_hour.GroupBy(c => c.typename).ToList().ForEach(x => vlist.Add(new kqzl_aqi_hour_out
                {
                    typename = x.Key,
                    data = x.Select(y => new kqzl_aqi_hour_data_out
                    {
                        day = y.day,
                        hour = y.hour,
                        amount = y.amount,
                        color = y.color
                    }).OrderBy(y => y.hour).ToList()
                }));           
                int num = vlist.Count();
                if (num > 0)
                {
                    resout.Output((int)codetype.CODE_OK, true, num, "查询成功", vlist);
                }
                else
                {
                    resout.Output((int)codetype.CODE_ERROR, false, num, "满足条件的记录不存在", null);
                }                
            }
        }
        catch (System.Threading.ThreadAbortException) { }
        catch (Exception ex)
        {
            resout.Output((int)codetype.CODE_ERROR, false, 0, ex.ToString(), null);

        }
    }


    [WebMethod(Description = "####################")]
    public void Get_ylzy_ylwsjg()
    {
        HeadData hd = new HeadData();
        ResultOutput resout = new ResultOutput();
        HttpResponse Response = Context.Response;
        NameValueCollection paras = this.Context.Request.Headers;

        string newtoken = paras["token"];

        //string newtoken = ParseField("token", string.Empty); //token
        var validtoken = CommonFunction.GetValidToken(newtoken);
        if (!validtoken.RetResult)
        {
            resout.Output((int)codetype.CODE_ERROR, false, 0, "查询失败,请传入有效令牌", null);
            Response.End();
        }
        string areaid = ParseField("areaid", string.Empty);  //传参-区域id
        try
        {
            using(SsisDbContext db = new SsisDbContext()) //连接数据库
            {
                IQueryable<ylzy_ylwsjg_model> list = db.ylzy_ylwsjg;
                if (!string.IsNullOrEmpty(areaid))  //通过区域id筛选查询
                {
                    list = list.Where(c => c.areaid == areaid);
                }

                var vlist = list.Select(c => new ylzy_ylwsjg_out
                {
                    areaid = c.areaid,
                    areaname = c.areaname,
                    typeid = c.typeid,
                    typename = c.typename,
                    o_amount = c.o_amount,
                    b_amount = c.b_amount
                }).ToList();   //查询结果转换为列表

                //List<ylzy_ylwsjg_out> vlist = db.ylzy_ylwsjg.Select(c => new ylzy_ylwsjg_out
                //{
                //    areaid = c.areaid,
                //    areaname = c.areaname
                //}).Distinct().OrderBy(c => c.areaid).ToList();  //获取区域编码和名称

                //List<ylzy_ylwsjg_jg_out> jglist = db.ylzy_ylwsjg.Select(c => new ylzy_ylwsjg_jg_out
                //{
                //    areaid = c.areaid,
                //    typeid = c.typeid,
                //    typename = c.typename,
                //    o_amount = c.o_amount,
                //    b_amount = c.b_amount
                //}).ToList();   //获取区域编码和机构详情

                //vlist.ForEach(a => a.data = jglist.Where(e => e.areaid == a.areaid).ToList()); //遍历区域编码对应的机构详情

                //List<ylzy_ylwsjg_out> vlist = new List<ylzy_ylwsjg_out>();
                //db.ylzy_ylwsjg.GroupBy(c => c.areaid).ToList().ForEach(x => vlist.Add(new ylzy_ylwsjg_out
                //{
                //    areaid = x.Key,
                //    data = x.Select(y => new ylzy_ylwsjg_jg_out
                //    {
                //        areaname = y.areaname,
                //        typeid = y.typeid,
                //        typename = y.typename,
                //        o_amount = y.o_amount,
                //        b_amount = y.b_amount
                //    }).ToList()
                //}));

                int num = vlist.Count();
                if (num > 0)
                {
                    resout.Output((int)codetype.CODE_OK, true, num, "查询成功", vlist);
                }
                else
                {
                    resout.Output((int)codetype.CODE_ERROR, false, num, "满足条件的记录不存在", null);
                }
            }
        }
        catch (Exception ex)
        {

            resout.Output((int)codetype.CODE_ERROR, false, 0, ex.ToString(), null);
        }
    }
}

上一篇下一篇

猜你喜欢

热点阅读