Служба WCF netTcp постоянно падает, требует перезапуска сервера - PullRequest
0 голосов
/ 28 августа 2018

У нас есть служба WCF netTcp, которая служит отправной точкой для некоторых унаследованных приложений в новой платформе сервиса, которую мы разработали. Сам сервис не очень интересен, в основном это просто однострочная операция, которая отбрасывает сообщение запроса в почтовый ящик для обработки новой платформой. Служба обычно работает отлично в течение нескольких недель, но иногда после перезапуска службы (она размещается внутри более крупной службы Windows) происходит сбой и отказывается перезапускаться до тех пор, пока весь сервер не будет перезагружен.

Мы включили трассировку WCF в непроизводственной среде и смогли воссоздать проблему, поэтому у нас есть несколько полных журналов трассировки проблемы, но она до сих пор не помогла нам определить первопричину.

Первое исключение, которое мы видим, это SocketException с сообщением An existing connection was forcibly closed by the remote host и собственным кодом ошибки 2746. Это происходит на SocketConnection.HandleReceiveAsyncCompleted. Следующее исключение (сразу после следа) - CommunicationException, говорящее The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '10675199.02:48:05.4775807'.

После этого любая попытка использовать объект WCF ServiceHost приводит к CommunicationObjectFaultedException со стандартным сообщением The communication object, System.ServiceModel.ServiceHost, cannot be used for communication because it is in the Faulted state. Перезапуск службы WCF или даже всей службы Windows приводит к немедленному отказу с теми же исключениями.

Последующие попытки автоматического перезапуска службы WCF (с использованием нового объекта ServiceHost) всегда встречают два других исключения. Первый - это AddressAlreadyInUseException, говорящий There is already a listener on IP endpoint 0.0.0.0:11300. This could happen if there is another application already listening on this endpoint or if you have multiple service endpoints in your service host with the same IP endpoint but with incompatible binding configurations. Второй - ArgumentException с сообщением Instance 'PublisherService@net.tcp:||localhost:11300|PublisherService' already exists in CounterSet 'e829b6db-21ab-453b-83c9-d980ec708edd'. Parameter name: InstanceName.

Для справки, код внутри службы Windows, которая управляет этой службой WCF, выглядит следующим образом:

// Create a PublisherService to send WCF requests to the Publisher Actor's mailbox
let publisherService = PublisherService(fun request -> publisherActor <! request)

let rec initHost () =                        
    // Create a new WCF ServiceHost for the Publisher Service
    let host = new ServiceHost(publisherService, [| config.PublisherServiceUri |])
    host.AddServiceEndpoint(typeof<IPublisherService>.FullName, NetTcpBinding(SecurityMode.None), config.PublisherServiceUri) |> ignore

    // Log any WCF Service Faulted events and try to start a new ServiceHost
    host.Faulted |> Event.add (fun _ -> 
        log.errorf "Publisher Service '%s' faulted. Restarting in 10 seconds..." config.PublisherServiceUri
        // BUG: Always fails with CommunicationObjectFaulted exception -- probably shouldn't be here
        try host.Close ()
        with | ex -> log.errorx ex "Error closing faulted Service Host"
        // TODO: Do something smarter than just sleeping for 10 seconds before restarting the service host
        Async.Sleep 10000 |> Async.RunSynchronously
        // BUG:  This isn't tail-recursive, will probably blow the stack eventually
        initHost () |> ignore)

    // Start the WCF Service Host
    host.Open()
    log.debugf "Publisher Service '%s' started." config.PublisherServiceUri

initHost()

Я понимаю, что у этого кода есть некоторые проблемы, но я не понимаю, почему даже перезапуск всей Службы Windows не позволяет чистому запуску службы WCF. Когда служба WCF запущена, кажется, что все в порядке на неопределенный срок, но если мы перезапустим ее по какой-либо причине, есть вероятность, что она перейдет в это состояние, после чего она станет полностью невосстановимой без перезагрузки сервера. Если кто-то может предложить какое-либо руководство по дальнейшему устранению неполадок, лежащих в основе проблемы, или знает что-либо, что может быть причиной такого поведения, я был бы признателен за помощь

...