Graph APIのメール送信を開発時(c#)、下記のエラーが出ました。
「Error 12002 calling WINHTTP_CALLBACK_STATUS_REQUEST_ERROR, '処理がタイムアウトになりました'」
調べた結果は、パソコン端末のプロキシの原因になります。(WinHTTPの設定)
IEのインターネットオプションのプロキシ設定はWebブラウザでインターネットを利用する時に利用されます。
しかし、Windows Update等、システムが利用するプロキシ設定はWinHTTPという設定を利用します。
WinHTTPはGUIでは設定出来ないため、netshコマンドで設定します。
エラー内容
Error 12002 calling WINHTTP_CALLBACK_STATUS_REQUEST_ERROR, '処理がタイムアウトになりました'
Status Code: 0
Microsoft.Graph.ServiceException: Code: generalException
Message: An error occurred sending the request.
---> System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.Http.WinHttpException: Error 12002 calling WINHTTP_CALLBACK_STATUS_REQUEST_ERROR, '処理がタイムアウトになりました'.
場所 System.Threading.Tasks.RendezvousAwaitable`1.GetResult()
場所 System.Net.Http.WinHttpHandler.<StartRequestAsync>d__122.MoveNext()
--- 内部例外スタック トレースの終わり ---
場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
場所 Microsoft.Graph.RedirectHandler.<SendAsync>d__6.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
場所 Microsoft.Graph.RetryHandler.<SendAsync>d__9.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
場所 Microsoft.Graph.CompressionHandler.<SendAsync>d__2.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
場所 Microsoft.Graph.AuthenticationHandler.<SendAsync>d__16.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
場所 System.Net.Http.HttpClient.<FinishSendAsyncBuffered>d__58.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
場所 Microsoft.Graph.HttpProvider.<SendRequestAsync>d__19.MoveNext()
--- 内部例外スタック トレースの終わり ---
場所 Microsoft.Graph.HttpProvider.<SendRequestAsync>d__19.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
場所 Microsoft.Graph.HttpProvider.<SendAsync>d__18.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
場所 Microsoft.Graph.BaseRequest.<SendRequestAsync>d__40.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
場所 Microsoft.Graph.BaseRequest.<SendAsync>d__33.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
場所 System.Runtime.CompilerServices.TaskAwaiter.GetResult()
場所 SmartWorksBatch.Program.<Main>d__7.MoveNext() 場所 Ctest\test\Program.cs:行 382
コマンドプロントでエラー対応方法
1.現在の設定の確認
netsh winhttp show proxy
2.IE設定のインポート
netsh winhttp import proxy source=ie
上記の二つ対応で、問題なくGraph APIメール送信ができました!
ソース側のエラーの解消
①プログラム側でWinHTTPのプロキシ設定する場合 :
//プロキシを設定する
string[] bypass = new string[] { "*.test.co.jp", ";*.test.co.jp" };
string proxyAdress = "http://proxy.test.co.jp:8080";
var winHttpProxy = new WebProxy(proxyAdress, false, bypass);
HttpClient httpClient = GraphClientFactory.Create(authProvider,proxy:winHttpProxy);
var graphClient = new GraphServiceClient(httpClient);
②プログラム側でインターネットオプションのWinHTTPプロキシ設定と同じものを利用する場合 :
//IEのWinHTTPのプロキシ設定をインポート
var winHttpProxy = WebRequest.GetSystemWebProxy();
HttpClient httpClient = GraphClientFactory.Create(authProvider, proxy:winHttpProxy);
var graphClient = new GraphServiceClient(httpClient);
参考サイト