WCF soap веб-сервис как Windows сервис недоступен - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть приложение. NET 4.6, в котором размещается веб-служба WCF soap. Это довольно базовый c, и он отлично работает, когда я запускаю его в настольном приложении classi c. NET 4.6 под своим собственным пользователем. Однако я хочу запустить его как Windows сервис под учетной записью сервиса. Я использую 100% точно такой же код wcf и определение сервиса, с той лишь разницей, что он внутри сервиса windows, но он не работает. Ответ не возвращается.

Так, например, в настольном приложении. NET 4.6 я могу отправлять запросы POST soap и получать ответы, а также просматривать определение на http://10.10.10.10: 8904 / blabla ? wsdl просто отлично. Когда я запускаю его как сервис Windows под учетной записью сервиса, он не отвечает. Например, просмотр к http://10.10.10.10: 8904 / blabla? Wsdl не дает никакого ответа (в браузере он продолжает вращаться).

В netstat я вижу Windows хостинг на порт 8904.

Если я включаю трассировку WCF в файл, я вижу журналы, подобные этой, поэтому, по-видимому, есть некоторая активность WCF по крайней мере:

<ExtendedData xmlns="http://schemas.microsoft.com/2006/08/ServiceModel/DictionaryTraceRecord">
    <ActivityName>Ontvang bytes op verbinding http://10.10.10.10:8904/blabla?wsdl.</ActivityName>
    <ActivityType>ReceiveBytes</ActivityType>
</ExtendedData>

Я также уже добавил: netsh http add urlacl url = http: // +: 8904 / blabla / user = Everyone

Есть идеи? Я пропускаю определенные права пользователя? Должна ли быть разница в конфигурации WCF между работой в качестве настольного приложения и службы windows?

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Решением было запустить службу из отдельного потока, а не из основного потока. В противном случае он блокируется.

0 голосов
/ 23 апреля 2020

Вообще говоря, управляемый код в настольном приложении отличается от фрагментов кода в службе windows. мы обычно используем учетную запись LocalSystem для запуска службы Windows, поскольку службе WCF требуется привилегия администратора для прослушивания порта компьютера. В методе OnStart необходимо открыть хост службы для прослушивания запроса.
Вот мои сегменты кода.

public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }
        Uri uri = new Uri("http://localhost:1017");
        ServiceHost sh = null;
        protected override void OnStart(string[] args)
        {
            BasicHttpBinding binding = new BasicHttpBinding();
            binding.Security.Mode = BasicHttpSecurityMode.None;
            try
            {
                sh = new ServiceHost(typeof(MyService), uri);
                sh.AddServiceEndpoint(typeof(IService), binding, "");
                ServiceMetadataBehavior smb;
                smb = sh.Description.Behaviors.Find<ServiceMetadataBehavior>();
                if (smb == null)
                {
                    smb = new ServiceMetadataBehavior()
                    {
                        HttpGetEnabled = true,
                    };
                    sh.Description.Behaviors.Add(smb);
                }
                Binding mexbinding = MetadataExchangeBindings.CreateMexHttpBinding();
                sh.AddServiceEndpoint(typeof(IMetadataExchange), mexbinding, "mex");

                sh.Open();
                WriteLog($"Service is ready at {DateTime.Now.ToString("hh-mm-ss")}");
            }
            catch (Exception e)
            {
                WriteLog($"{DateTime.Now.ToLongDateString()},{DateTime.Now.ToLongTimeString()}-----------------------------------------------------");
                WriteLog(e.ToString());
                throw;
            }
        }

        protected override void OnStop()
        {
            if (sh != null && sh.State == CommunicationState.Opened)
            {
                sh.Close();
                WriteLog($"Service is closed at {DateTime.Now.ToString("hh-mm-ss")}");
            }
        }

        public static void WriteLog(string text)
        {
            using (StreamWriter sw = File.AppendText(@"C:\Mylog.txt"))
            {
                sw.WriteLine(text);
                sw.Flush();
            }
        }
    }
    [ServiceContract(Namespace = "mydomain")]
    public interface IService
    {
        [OperationContract]
        string SayHello();

    }
    public class MyService : IService
    {
        public string SayHello()
        {
            Service1.WriteLog(string.Format("Wow, I have been called at {0}", DateTime.Now.ToString("hh-mm-ss")));
            return $"Hello stranger,Now is {DateTime.Now.ToString()}";
        }

    }

После установки службы с помощью средства installutil.exe и запуска службы мы можем получить доступ к странице создания службы.
enter image description here
enter image description here
https://docs.microsoft.com/en-us/dotnet/framework/windows-services/how-to-install-and-uninstall-services Не стесняйтесь сообщить мне, если проблема все еще существует.

...