• C#WebService实战篇


    以下仅是本人学习用,欢迎大家指正。

    目的:构建对外接口,验证成功后方能返回数据

    WebService对外接口不是全部对外公开,用户密码凭以下信息来来验证身份。

                    调用ID                                   用户名                            密码                               数据库                  说明                                      
    1001   test 123321 A 查询订单数据
    1002 admin   111111 C 查询对账单
             

    先根据ID,用户,密码来验证身份,如果身份通过,则自动匹配数据库A,然后返回相应的数据集,如果没通过,则返回异常代码或空结果。

     [WebMethod]
            public byte[] GET_CUSTOMER_TEST(string companyid, string userid, string userpwd)
            {
                string database = GetDatabase(companyid, userid, userpwd);
                if (database.Length>0)
                {
                    try
                    {
                        using (DataSet ds = SqlDataAdapter(server, database, "你的存储过程", CommandType.StoredProcedure, null))
                        {
                            if (ds != null)
                                return GetDataSetSurrogateZipBytes(ds);
                            else return null;
                        }
                    }
                    catch
                    {
                        return null;
                    }
                }
               else return null;
            }

    因为是根据前台输入的ID号,来指定库名,所以:

     private string GetDatabase(string companyid, string userid, string userpwd)
            {
                try
                {
                    SqlParameter[] sp = new SqlParameter[] { new SqlParameter("@companyid", companyid) ,
                 new SqlParameter("@userid", userid) ,
                 new SqlParameter("@userpwd", userpwd)        };
                    using (DataSet ds = SqlDataAdapter("(local)", "study", "select dbs from users where @companyid=companyid and @userid=userid and @userpwd=userpwd", CommandType.Text, sp))
                    {
                        if ((ds != null) && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                        {
    
                            return ValidDBS = ds.Tables[0].Rows[0]["DBS"].ToString();
                        }
                        else
                        {
                            return "";
                        }
    
                    }
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
            }
       
     private byte[] GetDataSetSurrogateZipBytes(DataSet ds)
            {
                DataSetSurrogate dss = new DataSetSurrogate(ds);
                BinaryFormatter bf = new BinaryFormatter();
                MemoryStream ms = new MemoryStream();
                bf.Serialize(ms, dss);
                byte[] buffer = ms.ToArray();
                byte[] Zipbuffer = Compress(buffer);
                return Zipbuffer;
            }
            //压缩压缩后的字节数组
            private byte[] Compress(byte[] data)
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    using (Stream zipStream = new GZipStream(ms, CompressionMode.Compress, true))
                    {
                        zipStream.Write(data, 0, data.Length);
                        zipStream.Close();
                        ms.Position = 0;
                        byte[] buffer = new byte[ms.Length];
                        ms.Read(buffer, 0, int.Parse(ms.Length.ToString()));
                        return buffer;
                    }
                }
            }
     private SqlConnection GetCon(string server, string database)
            {
                try
                {
                    uid = "sa";
                    pwd = "XXXX";
                    return new SqlConnection("server=" + server + ";database=" + database + ";uid=" + uid + ";pwd=" + pwd + ";Pooling=true;Min Pool Size=0;Max Pool Size=300");
    
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    
       private DataSet SqlDataAdapter(string server, string database, string Query, CommandType cmdtype, SqlParameter[] sp)
            {
                using (SqlConnection Conn = this.GetCon(server, database))
                {
                    using (SqlCommand command = new SqlCommand(Query, Conn))
                    {
                        command.CommandType = cmdtype;
                        if (sp != null && sp.Length > 0)
                        {
                            command.Parameters.AddRange(sp);
                        }
                        using (SqlDataAdapter adp = new SqlDataAdapter())
                        {
                            using (DataSet dataset = new DataSet())
                            {
                                try
                                {
                                    adp.SelectCommand = command;
                                    Conn.Open();
                                    adp.Fill(dataset);
                                    Conn.Close();
                                    return dataset;
                                }
                                catch
                                {
                                    Conn.Close();
                                    dataset.Dispose();
                                    adp.Dispose();
                                    command.Dispose();
                                    return null;
                                }
                                finally
                                {
                                    Conn.Close();
                                    dataset.Dispose();
                                    adp.Dispose();
                                    command.Dispose();
                                }
                            }
                        }
                    }
                }
            }


    这样服务器端就架设好了,前台代码如下:

      private void button3_Click(object sender, EventArgs e)
            {
                try
                {
                    string companyid = this.textBox1.Text.Trim();
                    string userid = this.textBox2.Text.Trim();
                    string userpwd = this.textBox3.Text.Trim();
                     
                    gridControl1.DataSource = new Class1().GetDsTest(companyid, userid, userpwd).Tables[0].DefaultView;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
     public DataSet GetDsTest(string companyid, string userid, string userpwd)
            {
                try
                {
                    byte[] zipbytes = WS.QSP_GET_CUSTOMER_TEST(companyid, userid, userpwd);
                    if (zipbytes != null)
                        return ConvertToDataSet(zipbytes);
                    else return NullDs();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    
     MYNWS.SviceInterface WS = new 我的WS.MYNWS.SviceInterface();
             public static byte[] Decompress(byte[] data)
             {
                 try
                 {
                     using (MemoryStream ms = new MemoryStream(data))
                     {
                         Stream zipStream = null;
                         zipStream = new GZipStream(ms, CompressionMode.Decompress);
                         byte[] dc_data = null;
                         dc_data = ExtractBytesFromStream(zipStream, data.Length);
                         return dc_data;
                     }
                     ///返回解压后的二进制数组
                 }
                 catch
                 {
                     return null;
                 }
             }
    
            public static byte[] ExtractBytesFromStream(Stream zipStream, int dataBlock)
            {
                try
                {
                    byte[] data = null;
                    int totalBytesRead = 0;
                    while (true)
                    {
                        Array.Resize(ref data, totalBytesRead + dataBlock + 1);
                        int bytesRead = zipStream.Read(data, totalBytesRead, dataBlock);
                        if (bytesRead == 0)
                        {
                            break;
                        }
                        totalBytesRead += bytesRead;
                    }
                    Array.Resize(ref data, totalBytesRead);
                    return data;
                }
                catch
                {
                    return null;
                }
            }
            public static DataSet ConvertToDataSet(byte[] ZipByte)
            {          
                try
                {               
                    if (ZipByte != null)
                    {
                        byte[] buffer = Decompress(ZipByte);
                        BinaryFormatter bf = new BinaryFormatter();
                        DataSetSurrogate dss= bf.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;
                        using (DataSet ds = dss.ConvertToDataSet())
                        {
                            return ds;
                        }
                    }
                    else { return null; }
                }
                catch (Exception ex) { throw ex; }
            }
    
            private DataSet NullDs()
            {
                DataSet ds = new DataSet();
                DataTable dt = new DataTable();
                DataColumn cl = dt.Columns.Add("id", typeof(string));
                DataRow dr = dt.NewRow();
                dr["id"] = "没有找到";
                dt.Rows.Add(dr);
                ds.Tables.Add(dt);
                return ds;
            }

     这里有几个问题:一是,每次都要去验证,去获取DBS,重复劳动了

    其次,如果验证失败,如何返回错误编号,友好提示给前台,是验证失败了,不至于因为点不出数据来,CS端就不停的点不停的点,浪费资源。

    网上还有其它的方法,还没有去实战,下一篇准备亲测一下(天下文章一大抄,害人不浅,所以我还是慢一点,实打实一点吧,笨人有笨人的办法)

  • 相关阅读:
    Tencent 闲聊对话机器人接口调用,画像:设计员小白
    logging模块简介python
    jieba分词的几种形式
    h5py这个坑-PyCharm Process finished with exit code -1073741819 (0xC0000005)
    python之six模块的用法six.py2 six.py3
    Swoole从入门到入土(8)——协程初探
    Swoole从入门到入土(7)——TCP服务器[大杂烩]
    Swoole从入门到入土(6)——TCP服务器[粘包]
    Swoole从入门到入土(5)——TCP服务器[异步任务]
    Swoole从入门到入土(4)——TCP服务器[正确重启]
  • 原文地址:https://www.cnblogs.com/bantongshui/p/3237820.html
Copyright © 2020-2023  润新知