2016-07-26 6 views
0

Я пытаюсь определить, почему вызов конечной точки 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

+0

Звонок на api, вероятно, не работает. Когда вы подключаетесь к Серверу, вы работаете с гостевыми привилегиями, которые обычно не имеют учетных данных для запуска api на сервере. Api должен быть установлен на сервере для запуска с правами администратора. Чтобы убедиться, что я прав, я бы проверил средство просмотра событий на сервере, чтобы получить более подробную информацию об ошибке. – jdweng

+0

Тот же вызов API с использованием HTTP работает, но когда я переключаю URI API, используйте HTTPS, он выдает ошибки выше. – Josh

+0

Вы проверяете нулевые ответы? Не уверен в первопричине, но я подозреваю, что вы можете получать пустые пакеты. – jdweng

ответ

0

Запись в журнале:

System.Net.Sockets Error: 0 : [2292] Socket#14347911::UpdateStatusAfterSocketError() - ConnectionReset

была вызвана брандмауэром, который блокировал порт. После добавления нового правила брандмауэра проблема была решена.