

タイトルの通りの現象に困っています

サーバーは Windows Server 2012 R2  
開発環境はVisual Studio 2015 + ASP.NET (.NET Framework 4.6.2)  
です

ざっくり現象を書くと  
Unmanaged dllを使ったWeb APIを呼ぶと固まってしまう  
同様の処理をCのCGI(exe)で実行するとちゃんと動く  
です

いろいろ試した結果を含めて詳細を以下に書きます

* * *

  1. サードパーティ製ライブラリを2種類使用するUnmanaged dll(64bit)を作成しています（このDLLを①とします）

  2. C言語のコンソールアプリで①をリンクして関数を呼ぶものを作りました（②）  
MVCのWeb Api 2コントローラーを作成して①を呼ぶものを作りました（③）

  3. ②，③はサーバーに配置してどちらもIISを通して呼ぶようにしました

  4. サーバーを再起動してサービスが立ち上がったと思われるタイミングで②を呼ぶと常識的な時間で応答を返してくれました

  5. 同じことを③で試すと応答がかえって来ません（クライアント側のタイムアウトや、アプリケーションプールのPingエラーで強制終了させられる）  
この状態は30分ほど待っても改善しません（それ以上は待っていないのでわかりません）

  6. ②を呼んだあと③を呼ぶと1,2回くらいの試行で応答を返してくれます

  7. 一度でも応答を返すとあとは普通に応答を返します  
iisresetコマンド等で再起動しても返します

  8. サーバーを再起動すると元（応答を返さない状態）に戻ります

  9. 「起動が遅い」等で調べると`<generatePublisherEvidence enabled="false"/>`が出てきたので試してみましたが変わりませんでした(v4以降は関係ないという記述もありましたし、今はサーバーをインターネットにつないでいる状態ですが変化なしです)

  10. ①の各ステップでログを出力するようにしたところ、サードパーティ製ライブラリの初期化周辺で止まっているようなのですが、止まる箇所は固定ではありませんでした（ログは毎回flushして閉じているので多分止まる直前を示していると思います）

* * *

という感じでして途方に暮れています  
原因や回避策があれば教えていただけますでしょうか


CC BY-SA 3.0
2017-02-22T07:54:26.340
32862
2020-01-11T15:01:50.217
20771
question
asp.net
ASP.NET MVCのWeb ApiでUnmanaged dllを使用するとOS再起動時の呼び出しが固まる


詳しい人に見ていただきましたがサードパーティ製ライブラリの不具合または環境依存の可能性が高いという結論になりました

Nativeアプリで呼び出す限り問題はないので、ASP.NETで直接呼び出さずNativeアプリを経由するように変更しました


CC BY-SA 3.0
2017-03-10T01:08:01.733
33224
2017-03-10T01:08:01.733
20772
32862
answer


DLL を リンクしてメソッド呼び出しの場合と、 exe 外部プロセスとして呼んだ場合の違いとして  
１）マルチスレッドの問題  
２）リソースの開放漏れの問題  
の違いがあると思います。  
exe 起動の場合、呼び出し終了時に メモリー上にあるリソースはすべて開放されます。  
dll から呼び出した場合に 関数内で 重要なリソースを開放していない場合には問題となります。

>   5. サービスが立ち上がったと思われるタイミングで③ を呼ぶと応答が返ってきません。
>   6. ②を呼んだあと③を呼ぶと1,2回くらいの試行で応答を返してくれます
>   7. 一度でも応答を返すとあとは普通に応答を返します
>

この部分を考慮すると、DLL 呼び出しの初期化ルーチンを処理中に 次の ③ 呼び出しが発生してデッドロックが発生しているのでは？ と感じました。

③ を呼び出す時に `System.Threading.Mutex` を使って 処理を マルチスレッドで  
行わないように排他処理を入れてみたらどうでしょうか？

>   7. 一度でも応答を返すとあとは普通に応答を返します
>

2回目以降は マルチスレッドでちゃんと動作するようなら  
`Mutex` による排他は 初回だけでもいいのかもしれません。  
しかし、そもそも ライブラリが マルチスレッドに対応していないのなら  
呼び出し毎に 排他する必要があります。

あとは、長時間利用して 該当のネイティブアプリが メモリーリーク等が  
発生していないか？ 長期的に確認する必要があると思います。


CC BY-SA 4.0
2019-11-11T22:58:08.457
60425
2019-11-11T23:29:59.247
2019-11-11T23:29:59.247
18851
18851
32862
answer