企業微信開發[windows服務定時傳送訊息]
阿新 • • 發佈:2019-02-06
背景
最近專案上要實現連線企業微信的介面,然後傳送訊息,並且是定時傳送訊息,所以針對這塊做了研究並且實現了方案
What is windows服務
最常見的大家應該都是dos視窗或者是form視窗,而windows服務就是實現當你的服務開啟,則他就開啟,當你把他的服務關閉則他也就是關閉,通常只要我們開啟之後,電腦不關機,那麼他就一直執行著,它是可以長時間執行的可執行應用程式,他不需要介面,非常適合與在伺服器上執行,
如何建立windows服務
安裝服務服務
- 必須以管理員的身份執行
- 開啟vs的dos介面
- 輸入自己vs中Framwork的版本號,例如
- d:\Windows\Microsoft.NET\Framework\v4.0.30319 回車
- 找到自己的應該程式(在我們的專案中bin下的begun下有一個exe應用程式)
在dos中輸入:
E:\TestApp\Winform\WinServiceTest\WinServiceTest\bin\Debug\XX.exe表示專案生成的exe檔案位置這個時候開啟服務你就會看見自己的服務了
程式碼編寫
獲取accesstoken
public static string getAccessToken()
{
//企業的唯一id
string appid = "不可以洩密哦";
//密包 ,。
string appsecret = "不可以洩密哦";
//例項化一個access_token
string access_token = null;
//傳送的地址和id,還是密保
string url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + appid + "&corpsecret=" + appsecret;
string jsonReturn = "";
//用於傳送和接受Http資料
//使用system.net名稱空間
//他有一點跟我們普通的物件不一樣,就是他不是用new不出來的物件,使用.Cretate()方法建立
HttpWebRequest httprequest = (HttpWebRequest)WebRequest.Create(url);
//請求的方式為get型別
httprequest.Method = "GET";
//讀取伺服器返回的資訊
HttpWebResponse response = (HttpWebResponse)httprequest.GetResponse();
using (Stream steam = response.GetResponseStream())
{
//我們使用stock表示把一個文字傳送到機器中,而使用Encode傳送給我們可以識別的數字
StreamReader reader = new StreamReader(steam, Encoding.GetEncoding("gb2312"));
//表示一次性的返回整個資訊
jsonReturn = reader.ReadToEnd();
//關閉資料流
steam.Close();
}
JObject jo = JObject.Parse(jsonReturn);
access_token = jo["access_token"].ToString();
return access_token;
}
}
編寫介面發
string AgentId = "1000003";
string postText = "{\"touser\" :\"@all\",\"toparty\" : \"@all\",\"totag\" : \"@all\",\"msgtype\" : \"text\",\"agentid\" : " + AgentId + ",\"text\" : {\"content\" : \"我是王大美人\n加油。\"},\"safe\":0}";
//轉化為位元組流的形式byte[],處了有utf-8的形式還有GB2312的形式,還有default形式,但是utf-8解決亂碼問題
//達到95%,而default達到90%
Encoding encoding = Encoding.GetEncoding("utf-8");
//呼叫方法把字串中的所有字元編碼為一個位元組序列
byte[] bytesToPost = encoding.GetBytes(postText);
//執行post提交方法,把地址和內容傳輸過去
string res = Post(url, bytesToPost);
//輸出字串,展現
Console.WriteLine(res);
}
post方式提交
private static string Post(string url, byte[] bytesToPost)
{
//判斷我的連結地址字串是否為空,他的空表示的是“ ”
//用這種方式寫的好處是方便閱讀,而且快上百萬毫秒以上
if (String.IsNullOrEmpty(url))
return "url引數為空值";
//判斷內容是否為空
if (bytesToPost == null)
return "post資料為空值";
string ResponseString = "";
//建立一個請求
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
//如果存在太多數目的alive的http請求,大於你設定的,那麼當你再次提交同樣的http的request,呼叫GetResponse就會發生超時,所以我們設定為50
System.Net.ServicePointManager.DefaultConnectionLimit = 50;
//TCP中一個可以檢測死連結的機制,可以不用false
request.KeepAlive = false;
//提交方式為post提交
request.Method = "POST";
//內容的型別
request.ContentType = "text/xml";//提交xml
//內容的長度,表示http的頭
request.ContentLength = bytesToPost.Length;
//寫入到internet中的Stream,使用者傳輸
Stream writer = request.GetRequestStream();
//把當前的流寫入字元序列,第一代表位元組,第二是從0的位置開始,第三個是長度
writer.Write(bytesToPost, 0, bytesToPost.Length);
//來自internet的資源相應
HttpWebResponse HttpWebRespon = (HttpWebResponse)request.GetResponse();
//1要讀取的流,2要轉換為的位元組編碼,把指點的位元組編碼轉換為制定的流
StreamReader myStreamReader = new StreamReader(HttpWebRespon.GetResponseStream(), Encoding.UTF8);
//從流的當前為值到流的最後位元組的位置
ResponseString = myStreamReader.ReadToEnd();
myStreamReader.Close();
//清除流中所有的緩衝區
writer.Flush();
if (writer != null)
{
writer.Close();
}
if (request != null)
{
//取消對資源的相應
request.Abort();
}
return ResponseString;
}
windows服務程式碼
public partial class Service1 : ServiceBase
{
//定時器
System.Timers.Timer t = null;
public Service1()
{
InitializeComponent();
//啟用暫停恢復
base.CanPauseAndContinue = true;
//每5秒執行一次
t = new System.Timers.Timer(5000);
//設定是執行一次(false)還是一直執行(true); 3600000
t.AutoReset = true;
//是否執行System.Timers.Timer.Elapsed事件;
t.Enabled = true;
//到達時間的時候執行事件(theout方法);
t.Elapsed += new System.Timers.ElapsedEventHandler(theout);
}
protected override void OnStart(string[] args)
{
string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "啟動";
}
protected override void OnStop()
{
string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "停止";
}
public void theout(object source, System.Timers.ElapsedEventArgs e)
{
send.SendWechat();
}
展現成功
總結
這一次算是自己對自己的一個突破把!很開心實現這個功能!