Bot SocketException Canales de Registro - Una conexión existente forzosamente fue cerrada por el host remoto

Pregunta hecha: hace 8 meses Ultima actividad: hace 8 meses
up 2 down

Tengo una aplicación web con Azure aplicación ASP.NET API REST para comportarse como un servicio para los canales Bot registro.

En esta aplicación, tengo un punto final

 public async Task<IHttpActionResult> Post(string userToken, string botName, [FromBody] Activity activity)

donde recibo un mensaje del usuario, procesarlo y enviar de vuelta.

Cuando tratando de comunicarse de nuevo al usuario (ya sea con la actividad de escribir a máquina o con una respuesta real)

private static async Task ShowTyping(Activity activity, ConnectorClient client)
{
    var typingResponse = new Activity
    {
        Conversation = activity.Conversation,
        From = activity.Recipient,
        Locale = activity.Locale,
        Recipient = activity.From,
        ReplyToId = activity.Id,
        Id = activity.Id,
        Type = "typing"
    };
    await client.Conversations.UpdateActivityAsync(typingResponse);
}

...

foreach (var reply in replies)
{
      Trace.TraceInformation($"[{userToken}:{botName}] Sending reply {reply.Id}:{reply.Text}");
      await client.Conversations.ReplyToActivityAsync(reply);
}

a través de la API REST recibo HttpRequestException - An existing connection was forcibly closed by the remote host:

2019-01-22T15:49:54  PID[17864] Error       System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send. ---> 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: An existing connection was forcibly closed by the remote host    at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)    at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)   
--- End of inner exception stack trace ---    at System.Net.TlsStream.EndWrite(IAsyncResult asyncResult)    at System.Net.PooledStream.EndWrite(IAsyncResult asyncResult)    at System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar)    --- End of inner exception stack trace ---    at System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context)    at System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar)    --- End of inner exception stack trace ---    at Microsoft.Rest.RetryDelegatingHandler.<SendAsync>d__15.MoveNext()
--- End of stack trace from previous location where exception was thrown ---    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)    at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)    at Microsoft.Bot.Connector.Conversations.<UpdateActivityWithHttpMessagesAsync>d__9.MoveNext()
--- End of stack trace from previous location where exception was thrown ---    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)    at Microsoft.Bot.Connector.ConversationsExtensions.<UpdateActivityAsync>d__16.MoveNext()
--- End of stack trace from previous location where exception was thrown ---    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)    at ChatFirst.Channels.BotFramework.Controllers.WebhookController.<ShowTyping>d__5.MoveNext()

Todo funciona bien en el emulador y no funciona en absoluto en el servicio web. Traté de poner en práctica REST API de cliente por mí mismo, pero tengo el mismo resultado.

¿Qué me estoy perdiendo?


Más información sobre el tema

  1. Yo uso paquetes de la estructura Bot v4.2

    <package id="Microsoft.Bot.Builder" version="4.2.0" targetFramework="net472" /> <package id="Microsoft.Bot.Connector" version="4.2.0" targetFramework="net472" /> <package id="Microsoft.Bot.Schema" version="4.2.0" targetFramework="net472" />

  2. Todo el método POST, userToken y botName son mis credenciales internos

    /// <summary>
    ///     POST: api/v1/webhook/{userToken}/{botName}
    ///     Receive a message from a user and reply to it
    /// </summary>
    [HttpPost]
    [Route("api/v1/webhook/{userToken}/{botName}")]
    public async Task<IHttpActionResult> Post(string userToken, string botName, [FromBody] Activity activity)
    {
        try
        {
            if (activity.Type == ActivityTypes.Message)
            {
                Trace.TraceInformation($"[{userToken}:{botName}] Message from {activity.From.Id}");
                MicrosoftAppCredentials credentials = _channelGateway.GetCredentials(userToken, botName);
    
                if (credentials == null)
                    return Ok();
    
                var serviceUri = new Uri(activity.ServiceUrl);
                var client = new ConnectorClient(serviceUri, credentials);
    
                await ShowTyping(activity, client);
    
                IEnumerable<Activity> replies = await _coreTalkService.GetRepliesAsync(new BotToken(userToken, botName), activity);
    
                foreach (var reply in replies)
                {
                    Trace.TraceInformation($"[{userToken}:{botName}] Sending reply {reply.Id}:{reply.Text}");
                    await client.Conversations.ReplyToActivityAsync(reply);
                }
            }
            else
            {
                HandleSystemMessage(activity);
            }
    
            return Ok();
        }
        catch (Exception e)
        {
            Trace.TraceError(e.ToString());
            return InternalServerError(e);
        }
    }
    
  3. Motor de búsqueda La configuración de los canales de Registros tiene este aspecto Bot SocketException Canales de Registro - Una conexión existente forzosamente fue cerrada por el host remoto

  4. Si REROUTE Bot Channel a la instancia local en mi PC a través dev ngrok recibo los mismos errores.

  5. He reducido método completo para llevar a cabo la respuesta de eco simple, pero sigue siendo de error

public async Task<IHttpActionResult> Post(string userToken, string botName, [FromBody] Activity activity)
{
    Trace.TraceInformation($"[{userToken}:{botName}] Message from {activity.From.Id}");
    var client = new ConnectorClient(new Uri(activity.ServiceUrl), 
        new MicrosoftAppCredentials("<secret>", "<secret>"));
    var answer = activity.CreateReply(activity.Text, activity.Locale);
    await client.Conversations.ReplyToActivityAsync(answer);
    return Ok();
}
  1. activity.ServiceUrl es https://webchat.botframework.com/
  2. Error ocurre si mensaje enviado a través de charla electrónica, no el registro otros canales Bot SocketException Canales de Registro - Una conexión existente forzosamente fue cerrada por el host remoto

2 respuestas

up 0 down

Cómo se utiliza TLS 1.2 como el Protocolo de Seguridad?

Ver esta respuesta: https://stackoverflow.com/a/53647879/3673445

"El 4 de diciembre, 2018, el Servicio Bot Azure requerirá que todas las conexiones para ser asegurado usando Transport Layer Security (TLS) 1.2. Este cumplimiento es fundamental para ofrecer la mejor seguridad posible para sus datos."

up 0 down

La única cosa que puedo pensar es que debe haber alguna biblioteca de referencia que está interfiriendo con los mensajes salientes en su proyecto.

En lugar de intentar depurar el proyecto, he creado un nuevo proyecto similar que funciona como se esperaba: https://github.com/xakpc/BotFrameworkChannel.Test/pull/1