搜索
首页后端开发C#.Net教程ASP.NET微信公众号客服接口

ASP.NET微信公众号客服接口

Dec 20, 2016 pm 01:43 PM
微信公众号

本文实例为大家分享了ASP.NET微信客服接口的具体代码,供大家参考,具体内容如下

Kf_account.cs代码:

public partial class Kf_account : Form
 {
  private readonly DataTable adt_user = new DataTable();
  private readonly string as_INIFile = Application.StartupPath + "\\user.ini";
 
  public Kf_account()
  {
   BindUser();
  }
 
  private void BindUser()
  {
   if (!File.Exists(as_INIFile))
   {
    var str = new StringBuilder();
    str.Append(";内容由程序自动生成,请不要修改此文件内容\r\n");
    str.Append("[total]\r\n");
    str.Append("total=\r\n");
    str.Append("[count]\r\n");
    str.Append("count=\r\n");
    str.Append("[user]\r\n");
    //StreamWriter sw = default(StreamWriter);
    //sw = File.CreateText(ls_INIFile);
    //sw.WriteLine(str.ToString());
    //sw.Close();
    File.WriteAllText(as_INIFile, str.ToString(), Encoding.Unicode);
    File.SetAttributes(as_INIFile, FileAttributes.Hidden);
   }
   CheckForIllegalCrossThreadCalls = false;
   InitializeComponent();
   Icon = Resource1.ico;
   lkl_num.Text = INIFile.ContentValue("total", "total", as_INIFile);
   lkl_num_c.Text = INIFile.ContentValue("count", "count", as_INIFile);
   pictureBox1.Visible = true;
   var sr = new StreamReader(as_INIFile, Encoding.Unicode);
   String line;
   int li_count = 0;
   adt_user.Columns.Clear();
   adt_user.Columns.Add("username", Type.GetType("System.String"));
   adt_user.Columns.Add("openid", Type.GetType("System.String"));
   while ((line = sr.ReadLine()) != null)
   {
    li_count++;
    if (li_count > 6)
    {
     line = SysVisitor.Current.GetFormatStr(line);
     DataRow newRow;
     newRow = adt_user.NewRow();
     newRow["username"] = line.Substring(0, line.LastIndexOf('='));
     newRow["openid"] = line.Substring(line.LastIndexOf('=') + 1);
     adt_user.Rows.Add(newRow);
    }
   }
   sr.Close();
   dataGridView1.AutoGenerateColumns = false;
   dataGridView1.DataSource = adt_user;
   //dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCells;
   lbl_count.Text = "共" + (li_count - 6) + "行";
   pictureBox1.Visible = false;
  }
 
  private void btn_GetUser_Click(object sender, EventArgs e)
  {
   if (MessageBox.Show(@"拉取用户信息的速度取决于你的关注数与网络速度,
可能需要几分钟甚至更长时间。
使用此功能将消耗大量用户管理接口配额。
要继续此操作吗?",
    "提示:", MessageBoxButtons.YesNo) == DialogResult.No)
   {
    return;
   }
   var thr = new Thread(Get_user_list);
   thr.Start();
  }
 
  private void Get_user_list()
  {
   File.Delete(as_INIFile);
   var str = new StringBuilder();
   str.Append(";内容由程序自动生成,请不要修改此文件内容\r\n");
   str.Append("[total]\r\n");
   str.Append("total=\r\n");
   str.Append("[count]\r\n");
   str.Append("count=\r\n");
   str.Append("[user]\r\n");
   File.WriteAllText(as_INIFile, str.ToString(), Encoding.Unicode);
   File.SetAttributes(as_INIFile, FileAttributes.Hidden);
 
   string ls_appid = INIFile.ContentValue("weixin", "Appid");
   string ls_secret = INIFile.ContentValue("weixin", "AppSecret");
   string access_token = "";
   string menu = "";
   if (ls_appid.Length != 18 || ls_secret.Length != 32)
   {
    MessageBox.Show("你的Appid或AppSecret不对,请检查后再操作");
    return;
   }
   access_token = SysVisitor.Current.Get_Access_token(ls_appid, ls_secret);
   if (access_token == "")
   {
    MessageBox.Show("Appid或AppSecret不对,请检查后再操作");
    return;
   }
   menu = SysVisitor.Current.GetPageInfo("https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + access_token);
   if (menu.Substring(2, 7) == "errcode")
   {
    MessageBox.Show("拉取失败,返回消息:\r\n" + menu);
   }
 
   JObject json = JObject.Parse(menu);
   lkl_num.Text = json["total"].ToString();
   INIFile.SetINIString("total", "total", lkl_num.Text, as_INIFile);
   lkl_num_c.Text = json["count"].ToString();
   INIFile.SetINIString("count", "count", lkl_num_c.Text, as_INIFile);
   int li_count = int.Parse(json["count"].ToString());
   btn_GetUser.Enabled = false;
   pictureBox1.Visible = true;
   FileStream fs = null;
   Encoding encoder = Encoding.Unicode;
   for (int i = 0; i < li_count; i++)
   {
    string openid, username;
    openid = Get_UserName(json["data"]["openid"][i].ToString());
    username = json["data"]["openid"][i].ToString();
    //INIFile.SetINIString("user", openid, username, as_INIFile);
    byte[] bytes = encoder.GetBytes(openid + "=" + username + " \r\n");
    fs = File.OpenWrite(as_INIFile);
    //设定书写的開始位置为文件的末尾 
    fs.Position = fs.Length;
    //将待写入内容追加到文件末尾 
    fs.Write(bytes, 0, bytes.Length);
    fs.Close();
    lab_nums.Text = "已拉取" + i + "个,还剩" + (li_count - i) + "个,请耐心等待";
   }
   lab_nums.Text = "";
   //BindUser();
   btn_GetUser.Enabled = true;
   pictureBox1.Visible = false;
   MessageBox.Show("已全部拉取完毕,请重新打开该窗口");
  }
 
  /// <summary>
  ///  获取用户信息详情,返回json
  /// </summary>
  /// <param name="as_openid"></param>
  private string Get_User(string as_openid)
  {
   string ls_json = "";
   string access_token = "";
   access_token = SysVisitor.Current.Get_Access_token();
   ls_json =
    SysVisitor.Current.GetPageInfo("https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + access_token + "&openid=" + as_openid + "&lang=zh_CN");
   return ls_json;
  }
 
  /// <summary>
  ///  获取用户用户的昵称
  /// </summary>
  private string Get_UserName(string as_openid)
  {
   string ls_json = "";
   ls_json = Get_User(as_openid);
   string username = "";
   JObject json = JObject.Parse(ls_json);
   username = json["nickname"].ToString();
   username = SysVisitor.Current.GetFormatStr(username);
   return username;
  }
 
  private void btn_search_Click(object sender, EventArgs e)
  {
   string username = txt_search.Text.Trim();
   if (string.IsNullOrWhiteSpace(username))
   {
    return;
   }
   DataRow[] datarows = adt_user.Select("username like &#39;%" + username + "%&#39;");
 
   var ldt = new DataTable();
   ldt.Columns.Clear();
   ldt.Columns.Add("username", Type.GetType("System.String"));
   ldt.Columns.Add("openid", Type.GetType("System.String"));
   ldt = ToDataTable(datarows);
   try
   {
    lbl_count.Text = ldt.Rows.Count.ToString();
   }
   catch
   {
   }
   dataGridView1.AutoGenerateColumns = false;
   dataGridView1.DataSource = ldt;
  }
 
  public DataTable ToDataTable(DataRow[] rows)
  {
   if (rows == null || rows.Length == 0) return null;
   DataTable tmp = rows[0].Table.Clone(); // 复制DataRow的表结构 
   foreach (DataRow row in rows)
    tmp.Rows.Add(row.ItemArray); // 将DataRow添加到DataTable中 
   return tmp;
  }
 
  private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
  {
   try
   {
    SysVisitor.Current.Wx_openid =
     dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1].Value.ToString();
    SysVisitor.Current.Wx_username =
     dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[0].Value.ToString();
    //MessageBox.Show(str);
    grb_chat.Enabled = true;
    grb_chat.Text = SysVisitor.Current.Wx_username;
   }
   catch
   {
 
   }
   webBrowser_msg.DocumentText = "";
   string url = string.Format("https://api.weixin.qq.com/cgi-bin/customservice/getrecord?access_token={0}",
    SysVisitor.Current.Get_Access_token());
   string ls_text = @"{";
   ls_text += "\"starttime\" : " + DateTime.Now.AddDays(-3).Ticks + ",";
   ls_text += "\"endtime\" : " + DateTime.Now.Ticks + ",";
   ls_text += "\"openid\" : \"" + SysVisitor.Current.Wx_openid + "\",";
   ls_text += "\"pagesize\" : 1000,";
   ls_text += "\"pageindex\" : 1,";
   ls_text += "}";
   string ls_history = SysVisitor.Current.PostPage(url, ls_text);
   webBrowser_msg.DocumentText = ls_history;
  }
 
  private void btn_send_Click(object sender, EventArgs e)
  {
   string ls_msg = richTextBox_msg.Text;
   string ls_text = @"{";
   ls_text += "\"touser\":\"" + SysVisitor.Current.Wx_openid + "\",";
   ls_text += "\"msgtype\":\"text\",";
   ls_text += "\"text\":";
   ls_text += "{";
   ls_text += "\"content\":\"" + ls_msg + "\"";
   ls_text += "}";
   ls_text += "}";
   string url = string.Format("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={0}",
    SysVisitor.Current.Get_Access_token());
   string ls_isright = SysVisitor.Current.PostPage(url, ls_text);
 
   webBrowser_msg.DocumentText += "<P><FONT size=3>" + ls_isright + "</FONT></P>";
  }
 
  private void btn_addkf_Click(object sender, EventArgs e)
  {
   string url = string.Format("https://api.weixin.qq.com/customservice/kfaccount/add?access_token={0}", SysVisitor.Current.Get_Access_token());
   //客服账号 设置 xxx@你的公众号 这样的格式才是正确的哟。
   string ls_text = "{";
   ls_text += "\"kf_account\":test2@gz-sisosoft,";
   ls_text += "\"nickname\":\"客服2\",";
   ls_text += "\"password\":\"12345\",";
   ls_text += "}";
   string ls_kf = @"{
       &#39;kf_account&#39; : &#39;test1@gz-sisosoft&#39;,
       &#39;nickname&#39; : &#39;客服1&#39;,
       &#39;password&#39; : &#39;123456&#39;,
      }";
   string ls_isok = SysVisitor.Current.PostPage(url, ls_text);
   MessageBox.Show(ls_isok);
  }
 
  private void Kf_account_Load(object sender, EventArgs e)
  {
  }
 }

SysVisitor.cs代码:

class SysVisitor
{
 private static SysVisitor visit = null;
 public static SysVisitor Current
 {
  get
  {
   if (visit == null)
    visit = new SysVisitor();
 
   return visit;
  }
 }
 /// <summary>
 /// 获取access_token
 /// </summary>
 /// <param name="appid">appid</param>
 /// <param name="secret">appsecret</param>
 /// <returns></returns>
 public string Get_Access_token(string appid, string appsecret)
 {
  string secondappid = INIFile.ContentValue("weixin", "secondappid");
  if (appid.ToLower() == secondappid.ToLower())
  {
   string ls_time = INIFile.ContentValue("weixin", "gettime");
   Decimal ldt;
   try
   {
    ldt = Convert.ToDecimal(ls_time);
    if (Convert.ToDecimal(DateTime.Now.ToString("yyyyMMddHHmmss")) - ldt < 7100)//每两个小时刷新一次
    {
     return INIFile.ContentValue("weixin", "access_token");
    }
   }
   catch
   { }
  }
  string ls_appid = appid.Replace(" ", "");
  string ls_secret = appsecret.Replace(" ", "");
  string access_token = "";
  string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", ls_appid, ls_secret);
  string json_access_token = GetPageInfo(url);
  //DataTable dt = Json.JsonToDataTable(json_access_token);
  DataTable dt = JsonHelper.JsonToDataTable(json_access_token);
  try
  {
   access_token = dt.Rows[0]["access_token"].ToString();
  }
  catch
  {
   return "";
  }
  INIFile.SetINIString("weixin", "gettime", DateTime.Now.ToString("yyyyMMddHHmmss"));
  INIFile.SetINIString("weixin", "access_token", access_token);
  INIFile.SetINIString("weixin", "secondappid", ls_appid);
 
  return access_token;
 }
 
 /// <summary>
 /// 获取access_token
 /// </summary>
 public string Get_Access_token()
 {
  string ls_appid = INIFile.ContentValue("weixin", "Appid");
  string ls_secret = INIFile.ContentValue("weixin", "AppSecret");
  return Get_Access_token(ls_appid, ls_secret);
 }
 
 /// <summary>
 /// Get方法请求url并接收返回消息
 /// </summary>
 /// <param name="strUrl">Url地址</param>
 /// <returns></returns>
 public string GetPageInfo(string url)
 {
  HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
  HttpWebResponse response = (HttpWebResponse)request.GetResponse();
 
  string ret = string.Empty;
  Stream s;
  string StrDate = "";
  string strValue = "";
 
  if (response.StatusCode == HttpStatusCode.OK)
  {
   s = response.GetResponseStream();
   ////在这儿处理返回的文本
   StreamReader Reader = new StreamReader(s, Encoding.UTF8);
 
   while ((StrDate = Reader.ReadLine()) != null)
   {
    strValue += StrDate + "\r\n";
   }
   //strValue = Reader.ReadToEnd();
  }
  return strValue;
 }
 
 /// <summary>
 /// Post方法
 /// </summary>
 /// <param name="posturl">URL</param>
 /// <param name="postData">Post数据</param>
 /// <returns></returns>
 public string PostPage(string posturl, string postData)
 {
  Stream outstream = null;
  Stream instream = null;
  StreamReader sr = null;
  HttpWebResponse response = null;
  HttpWebRequest request = null;
  Encoding encoding = Encoding.UTF8;
  byte[] data = encoding.GetBytes(postData);
  // 准备请求...
  try
  {
   // 设置参数
   request = WebRequest.Create(posturl) as HttpWebRequest;
   CookieContainer cookieContainer = new CookieContainer();
   request.CookieContainer = cookieContainer;
   request.AllowAutoRedirect = true;
   request.Method = "POST";
   request.ContentType = "application/x-www-form-urlencoded";
   request.ContentLength = data.Length;
   outstream = request.GetRequestStream();
   outstream.Write(data, 0, data.Length);
   outstream.Close();
   //发送请求并获取相应回应数据
   response = request.GetResponse() as HttpWebResponse;
   //直到request.GetResponse()程序才开始向目标网页发送Post请求
   instream = response.GetResponseStream();
   sr = new StreamReader(instream, encoding);
   //返回结果网页(html)代码
   string content = sr.ReadToEnd();
   string err = string.Empty;
   return content;
  }
  catch (Exception ex)
  {
   string err = ex.Message;
   return string.Empty;
  }
 }
 
 /// <summary>
 /// 格式化字符串
 /// </summary>
 /// <param name="str"></param>
 /// <returns></returns>
 public string GetFormatStr(string str)
 {
  if ("" == str)
   return "";
  else
  {
   str = str.Trim();
   str = str.Replace("&#39;", "&#39;");
   str = str.Replace("〈", "<");
   str = str.Replace("〉", ">");
   str = str.Replace(",", ",");
   return str;
  }
 }
 string ls_username = "";
 /// <summary>
 /// 用户名
 /// </summary>
 public string Wx_username
 {
  get
  {
   return ls_username;
  }
  set
  {
   ls_username = value;
  }
 }
 string ls_openid = "";
 /// <summary>
 /// Openid
 /// </summary>
 public string Wx_openid
 {
  get
  {
   return ls_openid;
  }
  set
  {
   ls_openid = value;
  }
 }
}

INIFile.cs代码:

class INIFile
{
 ///// <summary>
 ///// 设置INI文件参数
 ///// </summary>
 ///// <param name="section">INI文件中的段落</param>
 ///// <param name="key">INI文件中的关键字</param>
 ///// <param name="val">INI文件中关键字的数值</param>
 ///// <param name="filePath">INI文件的完整的路径和名称</param>
 ///// <returns></returns>
 //[DllImport("kernel32")]
 //private static extern long WritePrivateProfileString(
 // string section, string key, string val, string filePath);
 
 ///// <summary>
 ///// 获取INI文件参数
 ///// </summary>
 ///// <param name="section">INI文件中的段落名称</param>
 ///// <param name="key">INI文件中的关键字</param>
 ///// <param name="def">无法读取时候时候的缺省数值</param>
 ///// <param name="retVal">读取数值</param>
 ///// <param name="size">数值的大小</param>
 ///// <param name="filePath">INI文件的完整路径和名称</param>
 //[DllImport("kernel32")]
 //private static extern int GetPrivateProfileString(
 // string section, string key, string def, StringBuilder retVal, int size, string filePath);
 
 //static string gs_FileName = System.AppDomain.CurrentDomain.BaseDirectory + "Config.ini";
 
 ///// <summary>
 ///// 获取INI文件参数
 ///// </summary>
 ///// <param name="as_section">INI文件中的段落名称</param>
 ///// <param name="as_key">INI文件中的关键字</param>
 ///// <param name="as_FileName">INI文件的完整路径和名称</param>
 //public static string GetINIString(string as_section, string as_key, string as_FileName)
 //{
 // StringBuilder temp = new StringBuilder(255);
 // int i = GetPrivateProfileString(as_section, as_key, "", temp, 255, as_FileName);
 // return temp.ToString();
 //}
 ///// <summary>
 ///// 获取INI文件参数
 ///// </summary>
 ///// <param name="as_section">INI文件中的段落名称</param>
 ///// <param name="as_key">INI文件中的关键字</param>
 ///// <param name="as_FileName">INI文件的完整路径和名称</param>
 //public static string GetINIString(string as_section, string as_key)
 //{
 // return GetINIString(as_section, as_key, gs_FileName);
 //}
 
 ///// <summary>
 ///// 设置INI文件参数
 ///// </summary>
 ///// <param name="as_section">INI文件中的段落</param>
 ///// <param name="as_key">INI文件中的关键字</param>
 ///// <param name="as_Value">INI文件中关键字的数值</param>
 ///// <param name="as_FileName">INI文件的完整路径和名称</param>
 //public static long SetINIString(string as_section, string as_key, string as_Value, string as_FileName)
 //{
 // return WritePrivateProfileString(as_section, as_key, as_Value, as_FileName);
 //}
 ///// <summary>
 ///// 设置INI文件参数
 ///// </summary>
 ///// <param name="as_section">INI文件中的段落</param>
 ///// <param name="as_key">INI文件中的关键字</param>
 ///// <param name="as_Value">INI文件中关键字的数值</param>
 //public static long SetINIString(string as_section, string as_key, string as_Value)
 //{
 // return SetINIString(as_section, as_key, as_Value, gs_FileName);
 //}
 /// <summary>
 /// 写入INI文件
 /// </summary>
 /// <param name="section">节点名称[如[TypeName]]</param>
 /// <param name="key">键</param>
 /// <param name="val">值</param>
 /// <param name="filepath">文件路径</param>
 /// <returns></returns>
 [DllImport("kernel32")]
 public static extern long WritePrivateProfileString(string section, string key, string val, string filepath);
 [DllImport("kernel32.dll")]
 public extern static int GetPrivateProfileSectionNamesA(byte[] buffer, int iLen, string fileName);
 /// <summary>
 /// 写入INI文件(section:节点名称 key:键 val:值)
 /// </summary>
 /// <param name="section">节点名称</param>
 /// <param name="key">键</param>
 /// <param name="val">值</param>
 /// <returns></returns>
 public static long SetINIString(string section, string key, string val, string as_FilePath = "")
 {
  if (as_FilePath == "")
  {
   return (WritePrivateProfileString(section, key, val, strFilePath));
  }
  else
  {
   return (WritePrivateProfileString(section, key, val, as_FilePath)); 
  }
 }
 /// <summary>
 /// 读取INI文件
 /// </summary>
 /// <param name="section">节点名称</param>
 /// <param name="key">键</param>
 /// <param name="def">值</param>
 /// <param name="retval">stringbulider对象</param>
 /// <param name="size">字节大小</param>
 /// <param name="filePath">文件路径</param>
 /// <returns></returns>
 [DllImport("kernel32")]
 public static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retval, int size, string filePath);
 public static string strFilePath = Application.StartupPath + "\\Config.ini";//获取INI文件默认路径
 public static string strSec = "";
 
 //INI文件名
 
 
 /// <summary>
 /// 读取INI文件中的内容方法 (Section 节点名称;key 键)
 /// </summary>
 /// <param name="Section">节点名称</param>
 /// <param name="key">键</param>
 /// <returns></returns>
 public static string ContentValue(string Section, string key, string as_FilePath = "")
 {
 
  StringBuilder temp = new StringBuilder(1024);
  if (as_FilePath == "")
  {
   GetPrivateProfileString(Section, key, "", temp, 1024, strFilePath);
  }
  else
  {
   GetPrivateProfileString(Section, key, "", temp, 1024, as_FilePath); 
  }
  return temp.ToString();
 }
 /// <summary>
 /// 获取指定小节所有项名和值的一个列表 
 /// </summary>
 /// <param name="section">节 段,欲获取的小节。注意这个字串不区分大小写</param>
 /// <param name="buffer">缓冲区 返回的是一个二进制的串,字符串之间是用"\0"分隔的</param>
 /// <param name="nSize">缓冲区的大小</param>
 /// <param name="filePath">初始化文件的名字。如没有指定完整路径名,windows就在Windows目录中查找文件</param>
 /// <returns></returns>
 [DllImport("kernel32")]
 public static extern int GetPrivateProfileSection(string section, byte[] buffer, int nSize, string filePath);
 /// <summary>
 /// 获取指定段section下的所有键值对 返回集合的每一个键形如"key=value"
 /// </summary>
 /// <param name="section">指定的段落</param>
 /// <param name="filePath">ini文件的绝对路径</param>
 /// <returns></returns>
 public static List<string> ReadKeyValues(string section, string as_FilePath = "")
 {
  byte[] buffer = new byte[32767];
  List<string> list = new List<string>();
  int length = 0;
  if (as_FilePath == "")
  {
   length = GetPrivateProfileSection(section, buffer, buffer.GetUpperBound(0), strFilePath);
  }
  else
  {
   length = GetPrivateProfileSection(section, buffer, buffer.GetUpperBound(0), as_FilePath); 
  }
  string temp;
  int postion = 0;
  for (int i = 0; i < length; i++)
  {
   if (buffer[i] == 0x00) //以&#39;\0&#39;来作为分隔
   {
    temp = System.Text.ASCIIEncoding.Default.GetString(buffer, postion, i - postion).Trim();
    postion = i + 1;
    if (temp.Length > 0)
    {
     list.Add(temp);
    }
   }
  }
  return list;
 }
 /// <summary>
 /// 删除指定的key
 /// </summary>
 /// <param name="section">要写入的段落名</param>
 /// <param name="key">要删除的键</param>
 /// <param name="fileName">INI文件的完整路径和文件名</param>
 public static void DelKey(string section, string key, string as_FilePath = "")
 {
  if (as_FilePath == "")
  {
   WritePrivateProfileString(section, key, null, strFilePath);
  }
  else
  {
   WritePrivateProfileString(section, key, null, as_FilePath);
  }
 }
 /// <summary>
 /// 返回该配置文件中所有Section名称的集合
 /// </summary>
 public static ArrayList ReadSections()
 {
  byte[] buffer = new byte[65535];
  int rel = GetPrivateProfileSectionNamesA(buffer, buffer.GetUpperBound(0), strFilePath); 
  int iCnt, iPos;
  ArrayList arrayList = new ArrayList();
  string tmp;
  if (rel > 0)
  {
   iCnt = 0; iPos = 0;
   for (iCnt = 0; iCnt < rel; iCnt++)
   {
    if (buffer[iCnt] == 0x00)
    {
     tmp = System.Text.ASCIIEncoding.UTF8.GetString(buffer, iPos, iCnt - iPos).Trim();
     iPos = iCnt + 1;
     if (tmp != "")
      arrayList.Add(tmp);
    }
   }
  }
  return arrayList;
 } 
}

运行结果:

ASP.NET微信公众号客服接口

ASP.NET微信公众号客服接口

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
C#和.NET运行时:它们如何一起工作C#和.NET运行时:它们如何一起工作Apr 19, 2025 am 12:04 AM

C#和.NET运行时紧密合作,赋予开发者高效、强大且跨平台的开发能力。1)C#是一种类型安全且面向对象的编程语言,旨在与.NET框架无缝集成。2).NET运行时管理C#代码的执行,提供垃圾回收、类型安全等服务,确保高效和跨平台运行。

C#.NET开发:入门的初学者指南C#.NET开发:入门的初学者指南Apr 18, 2025 am 12:17 AM

要开始C#.NET开发,你需要:1.了解C#的基础知识和.NET框架的核心概念;2.掌握变量、数据类型、控制结构、函数和类的基本概念;3.学习C#的高级特性,如LINQ和异步编程;4.熟悉常见错误的调试技巧和性能优化方法。通过这些步骤,你可以逐步深入C#.NET的世界,并编写高效的应用程序。

c#和.net:了解两者之间的关系c#和.net:了解两者之间的关系Apr 17, 2025 am 12:07 AM

C#和.NET的关系是密不可分的,但它们不是一回事。C#是一门编程语言,而.NET是一个开发平台。C#用于编写代码,编译成.NET的中间语言(IL),由.NET运行时(CLR)执行。

c#.net的持续相关性:查看当前用法c#.net的持续相关性:查看当前用法Apr 16, 2025 am 12:07 AM

C#.NET依然重要,因为它提供了强大的工具和库,支持多种应用开发。1)C#结合.NET框架,使开发高效便捷。2)C#的类型安全和垃圾回收机制增强了其优势。3).NET提供跨平台运行环境和丰富的API,提升了开发灵活性。

从网络到桌面:C#.NET的多功能性从网络到桌面:C#.NET的多功能性Apr 15, 2025 am 12:07 AM

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

C#.NET与未来:适应新技术C#.NET与未来:适应新技术Apr 14, 2025 am 12:06 AM

C#和.NET通过不断的更新和优化,适应了新兴技术的需求。1)C#9.0和.NET5引入了记录类型和性能优化。2).NETCore增强了云原生和容器化支持。3)ASP.NETCore与现代Web技术集成。4)ML.NET支持机器学习和人工智能。5)异步编程和最佳实践提升了性能。

c#.net适合您吗?评估其适用性c#.net适合您吗?评估其适用性Apr 13, 2025 am 12:03 AM

c#.netissutableforenterprise-levelapplications withemofrosoftecosystemdueToItsStrongTyping,richlibraries,androbustperraries,androbustperformance.however,itmaynotbeidealfoross-platement forment forment forment forvepentment offependment dovelopment toveloperment toveloperment whenrawspeedsportor whenrawspeedseedpolitical politionalitable,

.NET中的C#代码:探索编程过程.NET中的C#代码:探索编程过程Apr 12, 2025 am 12:02 AM

C#在.NET中的编程过程包括以下步骤:1)编写C#代码,2)编译为中间语言(IL),3)由.NET运行时(CLR)执行。C#在.NET中的优势在于其现代化语法、强大的类型系统和与.NET框架的紧密集成,适用于从桌面应用到Web服务的各种开发场景。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境