2011-07-11 14 views
2

EWS Managed APIを使用してC#で作業していますが、インラインアタッチメントとして保存されたイメージを効率的に取得できません。EWS + Exchange 2007:インラインイメージを取得する

エンドポイントは、インラインイメージをパネルに完全に形成されたHTMLページとして表示することです。コード我々は現在、私たち:

 string sHTMLCOntent = item.Body; 

     FileAttachment[] attachments = null; 

     if (item.Attachments.Count != 0) 
     { 
     attachments = new FileAttachment[item.Attachments.Count]; 
     for (int i = 0; i < item.Attachments.Count; i++) 
     { 
      string sType = item.Attachments[i].ContentType.ToLower(); 
      if (sType.Contains("image")) 
      { 
      attachments[i] = (FileAttachment)item.Attachments[i]; 
      string sID = attachments[i].ContentId; 
      sType = sType.Replace("image/", ""); 
      string sFilename = sID + "." + sType; 
      string sPathPlusFilename = Directory.GetCurrentDirectory() + "\\" + sFilename; 
      attachments[i].Load(sFilename); 
      string oldString = "cid:" + sID; 
      sHTMLCOntent = sHTMLCOntent.Replace(oldString, sPathPlusFilename); 
      } 
     } 
     } 

(調達:http://social.technet.microsoft.com/Forums/en-US/exchangesvrdevelopment/thread/ad10283a-ea04-4b15-b20a-40cbd9c95b57

が...とはいえ、これは非常に効率的ではありませんし、私たちのWebアプリケーションの応答性を鈍化しています。誰もがこの問題のより良い解決策を持っていますか?私たちはExchange 2007 SP1を使用しているため、IsInlineプロパティはExchange 2010としてしか動作しません。

答えて

7

私はあなたのインデックス構築「CIDを」第1のS:

private const string CidPattern = "cid:"; 

private static HashSet<int> BuildCidIndex(string html) 
{ 
    var index = new HashSet<int>(); 
    var pos = html.IndexOf(CidPattern, 0); 
    while (pos > 0) 
    { 
     var start = pos + CidPattern.Length; 
     index.Add(start); 
     pos = html.IndexOf(CidPattern, start); 
    } 
    return index; 
}  

次にあなたが今、あなたのインデックス

private static void AdjustIndex(HashSet<int> index, int oldPos, int byHowMuch) 
{ 
    var oldIndex = new List<int>(index); 
    index.Clear(); 
    foreach (var pos in oldIndex) 
    { 
     if (pos < oldPos) 
      index.Add(pos); 
     else 
      index.Add(pos + byHowMuch); 
    }   
} 

private static bool ReplaceCid(HashSet<int> index, ref string html, string cid, string path) 
{ 
    var posToRemove = -1; 
    foreach (var pos in index) 
    { 
     if (pos + cid.Length < html.Length && html.Substring(pos, cid.Length) == cid) 
     { 
      var sb = new StringBuilder(); 
      sb.Append(html.Substring(0, pos-CidPattern.Length)); 
      sb.Append(path); 
      sb.Append(html.Substring(pos + cid.Length)); 
      html = sb.ToString(); 

      posToRemove = pos; 
      break; 
     } 
    } 

    if (posToRemove < 0) 
     return false; 

    index.Remove(posToRemove); 
    AdjustIndex(index, posToRemove, path.Length - (CidPattern.Length + cid.Length)); 

    return true; 
} 

に基づいてCIDを置き換える置き換え機能を必要とし、あなたができますそれに

FileAttachment[] attachments = null; 
var index = BuildCidIndex(sHTMLCOntent); 
if (index.Count > 0 && item.Attachments.Count > 0) 
{ 
    var basePath = Directory.GetCurrentDirectory(); 

    attachments = new FileAttachment[item.Attachments.Count]; 
    for (var i = 0; i < item.Attachments.Count; ++i) 
    { 
     var type = item.Attachments[i].ContentType.ToLower(); 
     if (!type.StartsWith("image/")) continue;      
     type = type.Replace("image/", ""); 

     var attachment = (FileAttachment)item.Attachments[i]; 
     var cid = attachment.ContentId; 
     var filename = cid + "." + type; 
     var path = Path.Combine(basePath, filename); 
     if(ReplaceCid(index, ref sHTMLCOntent, cid, path)) 
     { 
     // only load images when they have been found   
     attachment.Load(path); 
     attachments[i] = attachment; 
     } 
    } 
} 

追加の添付ファイルチェック:代わりにを呼び出します直接画像にパスを渡す場合は、別のスクリプトにリンクして、cidをパラメータとして渡してから、その画像の交換を元に戻って確認してください。交換からのイメージの読み込みのプロセスはhtml cidの置換を妨げず、htmlがブラウザに早く送ることができるので、ページをより速く読み込むことにつながる可能性があります。 PS:コードはテストされていないので、アイデアを得るだけです!

EDIT

が不足しているAdjustIndex機能を追加しました。 AdjustIndex

EDIT 2

固定された小バグ

関連する問題