Я пытаюсь определить, почему вызов конечной точки Restful API терпит неудачу, когда я использую HTTPS, но не HTTP из Windows Server 2012 R2. Тот же самый вызов HTTPS работает, когда я запускаю приложение локально на своем ноутбуке (Windows 7).Подключенное соединение было закрыто - вызов конечной точки API завершился неудачно
К сожалению, я не могу заставить Fiddler отображать вызовы, сделанные из приложения на веб-сервере, в API. Ошибки утилиты Loopback ExCption AppContainer, пытающиеся перечислить список AppContainers. Сервер также заблокирован групповыми политиками, поэтому я не могу отключить брандмауэр, чтобы попытаться решить проблему Fiddler.
вызов к API является: получено
public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request)
{
client = new HttpClient();
// removed code for setting ignoreCertErrors and environmentName
if (ignoreCertErrors && environmentName.ToUpper() != "PROD")
{
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
}
return client.SendAsync(request);
}
Ошибки:
================================================================= Message: The underlying connection was closed: An unexpected error occurred on a send. Stack Trace:
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResultar)================================================================= Message: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. Stack Trace:
at System.Net.TlsStream.EndWrite(IAsyncResult asyncResult)
at System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar)================================================================= Message: An existing connection was forcibly closed by the remote host Stack Trace:
at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)
at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)=================================================================
Как можно получить более подробную информацию? Я пытаюсь избежать инструментов низкого уровня, таких как Wireshark, я надеюсь, что есть опция trace/log/capture, более подробная информация о вызовах приложений к API, которые терпят неудачу.
ОБНОВЛЕНИЕ - Вот информация трассировки, когда это не удается:
System.Net Information: 0 : [2292] SecureChannel#49584532::.ctor(hostname=XX.XX.com, clientCertificates=0, encryptionPolicy=RequireEncryption)
System.Net Information: 0 : [2292] SecureChannel#49584532 - Left with 0 client certificates to choose from.
System.Net Information: 0 : [2292] Using the cached credential handle. System.Net Information: 0 : [2292] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = (null), targetName = XX.XX.com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation) System.Net Information: 0 : [2292] InitializeSecurityContext(In-Buffer length=0, Out-Buffer length=178, returned code=ContinueNeeded).
System.Net.Sockets Verbose: 0 : [2292] Socket#14347911::BeginSend()
System.Net.Sockets Verbose: 0 : [2292] Exiting Socket#14347911::BeginSend() -> OverlappedAsyncResult#19699911 System.Net.Sockets Verbose: 0 : [2292] Data from Socket#14347911::PostCompletion
[ Removed ]
System.Net.Sockets Verbose: 0 : [2292] Socket#14347911::EndSend(OverlappedAsyncResult#19699911)
System.Net.Sockets Verbose: 0 : [2292] Exiting Socket#14347911::EndSend() -> Int32#178
System.Net.Sockets Verbose: 0 : [2292] Socket#14347911::BeginReceive()
System.Net.Sockets Verbose: 0 : [2292] Exiting Socket#14347911::BeginReceive() -> OverlappedAsyncResult#2389992
System.Net.Sockets Verbose: 0 : [2292] Socket#14347911::EndReceive(OverlappedAsyncResult#2389992)
System.Net.Sockets Error: 0 : [2292] Socket#14347911::UpdateStatusAfterSocketError() - ConnectionReset
System.Net.Sockets Error: 0 : [2292] Exception in Socket#14347911::EndReceive - An existing connection was forcibly closed by the remote host. System.Net.Sockets Verbose: 0 : [2292] Exiting Socket#14347911::EndReceive() -> Int32#0
System.Net.Sockets Verbose: 0 : [2292] Socket#14
Звонок на api, вероятно, не работает. Когда вы подключаетесь к Серверу, вы работаете с гостевыми привилегиями, которые обычно не имеют учетных данных для запуска api на сервере. Api должен быть установлен на сервере для запуска с правами администратора. Чтобы убедиться, что я прав, я бы проверил средство просмотра событий на сервере, чтобы получить более подробную информацию об ошибке. – jdweng
Тот же вызов API с использованием HTTP работает, но когда я переключаю URI API, используйте HTTPS, он выдает ошибки выше. – Josh
Вы проверяете нулевые ответы? Не уверен в первопричине, но я подозреваю, что вы можете получать пустые пакеты. – jdweng