首页 > 解决方案 > 来自 GraphClient 的 PostDocument 引发异常 - 无法建立 SSL 连接

问题描述

我正在使用 MS GraphClient 使用 Microsoft 文档中的标准代码发布文档。我在 .NET Core 3.1 的 REST API 中的 Startup.ConfigureServices() 方法中设置 TLS1.2,如下所示。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

我在发布文档调用之前获得了带有客户端令牌的授权。发布文档的代码片段是

int maxSlice = 320 * 1024;
using var stream = new MemoryStream(Convert.FromBase64String(document.FileContent));

var uploadSession = await graphclient.Drives[driveId].Items[driveItemId].ItemWithPath("File_Name").CreateUploadSession().Request().PostAsync();

var fileUploadTask = new LargeFileUploadTask<DriveItem>(uploadSession, stream, maxSlice);

UploadResult<DriveItem> uploadResult = await fileUploadTask.UploadAsync();

var fileUploaded = uploadResult.ItemResponse;

我能够获取 uploadSession,但是当它尝试执行 UploadAsync() 时,它会引发 SSL 连接失败。这种情况偶尔发生。如果发送了一系列 5 到 8 个文档,则其中一个或两个因 SSL 连接失败而失败。为每个要上传的文档获取一个具有授权的类的新实例。应用程序部署在 IIS 中,内存增加到一个非常好的数量。服务器可用内存超过 5GB。服务器和共享点之间的防火墙很好,没有看到任何网络呼叫中断的问题。但不知道 Microsoft Graphclient 是否有任何已知问题。

任何帮助表示赞赏。

下面是异常的堆栈跟踪

Status Code: 0
Microsoft.Graph.ServiceException: Code: generalException
Message: An error occurred sending the request.

 ---> System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
 ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host..
 ---> System.Net.Sockets.SocketException (10054): An existing connection was forcibly closed by the remote host.
   --- End of inner exception stack trace ---
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.GetResult(Int16 token)
   at System.Net.FixedSizeReader.ReadPacketAsync(Stream transport, AsyncProtocolRequest request)
   at System.Net.Security.SslStream.InternalEndProcessAuthentication(LazyAsyncResult lazyResult)
   at System.Net.Security.SslStream.EndProcessAuthentication(IAsyncResult result)
   at System.Net.Security.SslStream.EndAuthenticateAsClient(IAsyncResult asyncResult)
   at System.Net.Security.SslStream.<>c.<AuthenticateAsClientAsync>b__65_1(IAsyncResult iar)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location where exception was thrown ---
   at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean allowHttp2, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at Microsoft.Graph.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at Microsoft.Graph.RetryHandler.SendAsync(HttpRequestMessage httpRequest, CancellationToken cancellationToken)
   at Microsoft.Graph.CompressionHandler.SendAsync(HttpRequestMessage httpRequest, CancellationToken cancellationToken)
   at Microsoft.Graph.AuthenticationHandler.SendAsync(HttpRequestMessage httpRequestMessage, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
   at Microsoft.Graph.SimpleHttpProvider.SendRequestAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at Microsoft.Graph.SimpleHttpProvider.SendRequestAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken)
   at Microsoft.Graph.SimpleHttpProvider.SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken)
   at Microsoft.Graph.UploadSliceRequest`1.SendRequestAsync(Stream stream, CancellationToken cancellationToken, HttpCompletionOption completionOption)
   at Microsoft.Graph.UploadSliceRequest`1.PutAsync(Stream stream, CancellationToken cancellationToken)
   at Microsoft.Graph.LargeFileUploadTask`1.UploadSliceAsync(UploadSliceRequest`1 uploadSliceRequest, ICollection`1 exceptionTrackingList)
   at Microsoft.Graph.LargeFileUploadTask`1.UploadAsync(IProgress`1 progress, Int32 maxTries)

标签: microsoft-graph-api.net-core-3.1

解决方案


推荐阅读