Служба net.tcp работает, когда она размещена на адаптере прослушивателя Net.Tcp, но не на службе Windows. - PullRequest
1 голос
/ 29 декабря 2011

Я создал службу WCF net.tcp и разместил ее с помощью адаптера прослушивателя Net.Tcp, и он прекрасно работает - у меня настроен обмен сообщениями в обратном вызове, поэтому служба обновляет клиента со статусом. Теперь я пытаюсь заставить его работать, размещаясь через службу Windows, и все, что я делаю, - это создаю ServiceHost, используя тот же класс, что и оригинальный:

using System.Diagnostics;
using System.ServiceModel;
using System.ServiceProcess;
using BuilderService;

namespace BuilderWindowsService
{
    public class BuilderWindowsService : ServiceBase
    {
        public ServiceHost ServiceHost = null;
        public BuilderWindowsService()
        {
            ServiceName = ServiceNames.Builder;
        }

        public static void Main()
        {
            Run(new BuilderWindowsService());
        }

        protected override void OnStart(string[] args)
        {
            if (ServiceHost != null)
                ServiceHost.Close();
            ServiceHost = new ServiceHost(typeof(Builder));
            ServiceHost.Open();
        }

        protected override void OnStop()
        {
            if(ServiceHost != null)
            {
                ServiceHost.Close();
                ServiceHost = null;
            }
        }
    }
}

Я могу подключиться к услуге и отправить запрос, но он никогда не отвечает и не прерывается. Я знаю, что подключаюсь к службе Windows, потому что она у меня на другом порту (8002), и я могу добавить ее в качестве ссылки, используя это.

Мой App.config для службы Windows в значительной степени идентичен Web.config оригинала. То же самое для клиента, которым я пользуюсь, за исключением того, что он указывает на конечную точку 8002 вместо 808. Кроме того, у меня уже есть эта работа для другой службы, выполняющая точно такую ​​же настройку, но по какой-то причине эта никогда не отвечает.

UPDATE

Я создал небольшое клиентское приложение для проверки прямого попадания в службу Windows, чтобы исключить что-либо мешающее, и оно сгенерировало следующий app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="NetTcpBinding_IBuilder" 
                         closeTimeout="00:01:00"
                         openTimeout="00:01:00"
                         receiveTimeout="00:10:00"
                         sendTimeout="00:01:00"
                         transactionFlow="false" 
                         transferMode="Buffered"
                         transactionProtocol="OleTransactions"
                         hostNameComparisonMode="StrongWildcard" 
                         listenBacklog="10"
                         maxBufferPoolSize="2147483647" 
                         maxBufferSize="2147483647"
                         maxConnections="10"
                         maxReceivedMessageSize="2147483647">
                    <readerQuotas maxDepth="32"
                                  maxStringContentLength="2147483647"
                                  maxArrayLength="2147483647"
                                  maxBytesPerRead="4096"
                                  maxNameTableCharCount="2147483647" />
                    <reliableSession ordered="true" 
                                     inactivityTimeout="00:10:00"
                                     enabled="false" />
                    <security mode="Message">
                        <transport clientCredentialType="Windows" 
                                   protectionLevel="EncryptAndSign" />
                        <message clientCredentialType="Windows" 
                                 algorithmSuite="Default" />
                    </security>
                </binding>
            </netTcpBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://localhost:8002/BuilderService/Builder.svc"
                      binding="netTcpBinding"
                      bindingConfiguration="NetTcpBinding_IBuilder"
                      contract="RGBRef.IBuilder" 
                      name="NetTcpBinding_IBuilder">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

Что выглядит довольно нормально для меня (примечание: я вручную увеличил значения длины буфера / строки до максимума). Только вещи, которые отличаются от моего исходного конфига:

transferMode="Buffered"
transactionProtocol="OleTransactions"
listenBacklog="10"
<transport clientCredentialType="Windows" 
           protectionLevel="EncryptAndSign" />

Не уверен, ожидает ли служба тех или иных целей. В любом случае, он по-прежнему не получает ни ответа, ни ошибки.

1 Ответ

1 голос
/ 29 декабря 2011

Возможно, служба неисправна, поскольку теперь она работает с другими учетными данными, как служба Windows.Напишите несколько записей EventLog, чтобы отслеживать, где происходит сбой.Я не верю, что это обратный вызов, я подозреваю, что в службе происходит сбой.

...