質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

VSTO

Visual Studio Tools for Office

Q&A

解決済

2回答

1081閲覧

Outlook365 VSTOアドインでヘルス応答を実現するには?

退会済みユーザー

退会済みユーザー

総合スコア0

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

VSTO

Visual Studio Tools for Office

0グッド

1クリップ

投稿2021/03/27 09:33

あまり調べ切れていない段階で恐縮ですが、質問させてください。
Outlook365で、ある機能のVSTOアドインを自社開発しましたが(.NET Framework 4.7.2+C#)
アドインが正常に動いているかをチェックするために、ヘルス応答機能を実装したいと考えています。

ASP.Net Coreには、Microsoft.AspNetCore.Diagnostics.HealthChecks という、それ専用のコンポーネントがあるようですが、これは、VSTOアドインの中で使えるものでしょうか?
もし使えない場合、自前での実装も止むを得ませんが、どういった方法があるのか、どれ辺りが適当な方法なのかがわかりません。

ご存じの方に教えていただけると助かります。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/03/27 10:24

> アドインが正常に動いているかをチェックするために、ヘルス応答機能を実装したいと考えています。 反対に、ヘルス要求が発生するのはどこからなのでしょうか。何らかのリモートプロセスであったりしますか。また、自社開発したVSTOアドインと言うものがどこに組み込まれるものなのか示した方が良いと思います。Outlookであるのか、Excelであるのか、はたまた別のか。 > ASP.Net Coreには、Microsoft.AspNetCore.Diagnostics.HealthChecks という、それ専用のコンポーネントがあるようですが、これは、VSTOアドインの中で使えるものでしょうか? 以下を見るに、あくまでASP.NET Coreでホスティングされたサーバーが、連携先のDBなどのサーバーとのヘルスチェックに使うパッケージのようなので、クライアントサイドのVSTOでは使えないと思います。 https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks ※回答ではなく、ご質問内容に不明な点が多いと思っての指摘です。
dodox86

2021/03/27 10:28

思い付きですが、VSTOアドイン自身が、稼働するタイミングで定型の自己診断をして何らかのサーバーに通知してしまうという手もあります。通信できれば、ですが。
退会済みユーザー

退会済みユーザー

2021/03/27 10:36

コメントありがとうございます。アドインはOutlookの中です。 ヘルス要求をする側は、タスクバーに常駐するプログラムで、アドインのヘルス応答実装に合わせて適宜改良の予定です。ASP.NET Coreの情報サイトについてご紹介ありがとうございます。やはり、これはそれ独自の領域で使うもののようですね。
guest

回答2

0

dodox86様からアドバイスをいただいた名前付きパイプのほうがベターだと思いますので、こちらを採用することにしました。アドイン側のコードを参考までに付記します。

C#

1using System; 2using System.IO.Pipe; 3using System.Threading.Tasks; 4 5public static class HealthCheck 6{ 7 public static void StartByPipe() 8 { 9 Task.Run(() => 10 { 11 while (HealthCheckByPipe()) 12 { 13 // Don't care 14 } 15 }); 16 } 17 private static bool HealthCheckByPipe() 18 { 19 try 20 { 21 string PIPE_NAME = "health-pipe"; 22 using (var pipeServer = new NamedPipeServerStream( 23 PIPE_NAME, PipeDirection.InOut)) 24 { 25 pipeServer.WaitForConnection(); 26 using (var writer = new StreamWriter(pipeServer)) 27 { 28 string sTime = DateTime.Now.ToString("yyyy/MM/dd-HH:mm:ss.fff"); 29 writer.AutoFlush = true; 30 writer.WriteLine($"{sTime} Response"); 31 } 32 return true; 33 } 34 } 35 catch (Exception ex) 36 { 37 return false; 38 } 39 } 40} 41

投稿2021/03/28 22:24

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

手っ取り早い方法として、System.IO.FileSystemWatcherのNotifyFiltersを使って、テキストファイルベースでヘルスチェックを実装することにしました。決まったファイルに外部プログラムが何かを書き込むと、それをアドインが検出して、応答をファイルの末尾に追記する方法で、この追記があれば外部プログラムはアドインが有効に動いていると判断します。参考までに、アドイン側のコードを以下に付記します。

C#

1public static class HealthCheck 2{ 3 private static object _oLock; 4 5 public static void Start() 6 { 7 var watcher = new System.IO.FileSystemWatcher() 8 { 9 Path = @"C:\Temp", 10 Filter = "OutlookAddin.run", 11 IncludeSubdirectories = false, 12 NotifyFilter = 13 System.IO.NotifyFilters.LastWrite | System.IO.NotifyFilters.LastAccess, 14 }; 15 watcher.Created += CatchFileCreated; 16 watcher.Changed += CatchFileChanged; 17 watcher.EnableRaisingEvents = true; 18 _oLock = new object(); 19 } 20 private static void CatchFileCreated(object sender, FileSystemEventArgs e) 21 { 22 Rewrite(e.FullPath); 23 } 24 private static void CatchFileChanged(object sender, FileSystemEventArgs e) 25 { 26 Rewrite(e.FullPath); 27 } 28 private static void Rewrite(string sFullPath) 29 { 30 lock(_oLock) 31 { 32 string sTime = DateTime.Now.ToString("yyyy/MM/dd_HH:mm:ss.fff"); 33 File.AppendAllText(sFullPath, $"{sTime} rewrited"); 34 } 35 } 36} 37

投稿2021/03/28 05:29

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/03/28 06:11

VSTOアドインの中からでもWindowsのプロセス間通信方法のひとつである名前付きパイプ(NamedPipe)が使えます。(<回答しようかと思い、確認していた) クライアント/サーバー型になり、ファイルの更新監視よりは面倒な手法になりますが、プロセス間通信を使う方がどちらかと言うと一般的です。が、やりたいことが実現できれば何でも良いとも思いますので、参考として本コメントのみ投稿しておきます。
退会済みユーザー

退会済みユーザー

2021/03/28 07:21

NamedPipeは押さえていませんでした。それを使う方がファイルより自然な方法でしょうね。確認してみます。貴重なアドバイス、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問