用iSpring+MSMQ+觸發器 達成自動PPT轉SWF
功能:
使用者上傳PPT檔後做SWF轉檔,我們要考量到的因素有下列:
1.程式專檔不直接在asp.net的程序做,因為這樣會讓User會誤以為網頁死當
2.不透過資料庫
1.原本一開始是打算要用觸發器(Trigger)來做,後來放棄.....因為要開啟xp_cmdshell 實在太危險了
2.後來又想到第二個方式,先把要轉檔的資料訊息寫到DB,在寫一支WebService每分鐘讀這個DB做轉檔,後來放棄,因為我不太愛每分鐘去讀DB這個動作.....
3.不能與原本的專案有任何的關聯,將來的其它專案也能一併使用
安裝:
1.iSpring下載網址 下載 (下載後安裝) 30天試用
2.安裝訊息佇列(MSMQ)
如果在安裝訊息佇列發生錯誤訊息(0x42c)時你需要檢查以下條件:
- 先去控制台>>系統管理>>服務
- 找尋下列服務是否都有開啟
Windows XP
- Distributed Transaction Coordinator
- Message Queuing access control
- NT LM Security Support Provider
- Reliable Multicast Protocol Driver
- Remote Procedure Call (RPC)
- Security Accounts Manager
Windows 2003 server
- Message Queuing access control
- NT LM Security Support Provider
- Remote Procedure Call (RPC)
- RMCAST (Pgm) Protocol Driver
- Security Accounts Manager
Windows Vista
- Message Queuing access control
- Remote Procedure Call (RPC)
- Windows Event Log
轉檔程式:
接下來,我們要寫一支轉檔的控制台程式,程序如下
- 新增控制台專案
- 引入參考 iSpring 5.0 Type Library
- 撰寫程式
using System;
using System.Collections.Generic;
using System.Text;
using iSpring;
namespace ispring_samples
{
public class Сonverter
{
static void Main(String[] args)
{
PresentationConverter converter = new PresentationConverter();
string path = @"c:\test\";
try
{
///args[0]原始PPT檔案
converter.OpenPresentation(args[0]);
PrintMessage("Start Convert....");
converter.GenerateSolidPresentation(path + (Guid.NewGuid()) + ".swf", "online", "");
converter.ClosePresentation();
}
catch (Exception)
{
PrintMessage(("Error: " + converter.LastErrorDescription));
}
}
private static void PrintMessage(String message)
{
Console.WriteLine(message);
}
}
}
設定MSMQ:
接下來的動作,是每當佇列接收到訊息,馬上會將資料丟給轉檔程式做轉檔,一步一步跟我做唄 ^^
- 控制台>系統管理>電腦管理
- 訊息佇列>私用佇列,按右鍵新增一個私用佇列(這裡是用ispring),然後將交易式打勾這是為了確保我們的訊息是用交易模式,以防資料遺失
設定MSMQ觸發器:
- 在訊息佇列觸發程序>規則>新增一個規則
- 輸入規則名稱>按下一步
- 規則條件不用給條件,直接按下一步
- 接下來規則動作設定如下,其中的執行檔路徑指向我們寫的專檔程式
- 設定參數,請選擇[訊息本文],而這裡的訊息本文就是指我們預轉檔的檔案
- 與桌面互動如果打勾,表示會跑出執行畫面,這裡我們將他打勾以方便測試
規則建立完之後,我們就要來建立觸發器
- 在訊息佇列觸發程序>觸發程序>新增一個觸發器
- 觸發程序名稱填入: .\private$\ispring 後按下一步
- 接下來,選擇我們剛建立的規則,就完成了我們觸發程序的動作了
撰寫WEB AP程式:
- 建立一個新網站,裡面只放了一個發送的按鈕Button1
- 撰寫發送訊息程式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Messaging;
public partial class Queue : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
try
{
MessageQueue MyMessageQ = new MessageQueue(@".\Private$\ispring");
//使用交易模式
MessageQueueTransaction mt = new MessageQueueTransaction();
//MyMessageQ.Formatter = new MyFormater();
mt.Begin();
System.Messaging.Message message = new System.Messaging.Message();
//訊息編碼模式
message.Formatter = new System.Messaging.ActiveXMessageFormatter();
message.Body = @"c:\test\2.ppt";
MyMessageQ.Send(message,mt);
mt.Commit();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}
}
大致上的功能已經完成,當你按下按鈕後會執行
WEB AP=>MSMQ QUEUE=>Exceute MSMQ Trigger=>Call the Convert Program=> ?????
但有沒有發現一件事,我們轉檔是轉檔完成了,但好像少了一個步驟
訊息還存在!? 這會造成什麼問題,如果你嘗試著把訊息留著~~你重開機電腦後,電腦會很聰明的把你所有的訊息佇列在重頭到尾在跑一次
那可是一個大災難呀 lol
所以我們要多加一個動作,就是轉檔完後要將訊息移掉
多設定一個規則的參數(訊息識別碼):
- 訊息Queue移除檔案是依照他所謂的訊息識別碼,所以我們要在規則裡,多傳這一個參數
修正轉檔程式增加移除功能:
- 接下來我們修改一下轉檔程式
using System;
using System.Collections.Generic;
using System.Text;
using iSpring;
using System.Messaging;
namespace ispring_samples
{
public class Сonverter
{
static void Main(String[] args)
{
PresentationConverter converter = new PresentationConverter();
MessageQueue popQ = new MessageQueue(@".\Private$\ispring");
string QueueKey = args[1];
string path = @"c:\test\";
try
{
///args[0]原始PPT檔案
converter.OpenPresentation(args[0]);
PrintMessage("Start Convert....");
converter.GenerateSolidPresentation(path + (Guid.NewGuid()) + ".swf", "online", "");
//移除佇列訊息
//PrintMessage(QueueKey);
popQ.ReceiveById(QueueKey.Replace("{","").Replace("}",""));
converter.ClosePresentation();
}
catch (Exception)
{
PrintMessage(("Error: " + converter.LastErrorDescription));
}
}
private static void PrintMessage(String message)
{
Console.WriteLine(message);
}
}
}
呼....
大概花了一天的時間做研究跟找元件
大功告成!!!我們已經做出了一個雛形了,太好了 ^ ^;
第一次寫那麼長的文章,請多指教