Да, как вы сказали, клиент должен вызвать службу, прежде чем сервер отключится автоматически.Вы можете использовать следующую инструкцию, чтобы предотвратить автоматическое отключение сервера.
class Program
{
static void Main(string[] args)
{
Uri uri = new Uri("http://localhost:13020");
BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.None;
using (ServiceHost 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.Opened += delegate
{
Console.WriteLine("service is ready...");
};
sh.Closed += delegate
{
Console.WriteLine("Service is closed now...");
};
sh.Open();
Console.ReadLine();
sh.Close();
}
}
}
Остается один вопрос: как заставить сервер работать без прав администратора?
Вы можете дать своей учетной записи приложения необходимые разрешения.Для этого мы зарезервировали пространство имен URL для учетной записи, позволяя соответствующему приложению зарегистрировать этот URL.Мы можем использовать команду Netsh (для этого инструмента требуются права администратора).
Netsh http add urlacl url=http://+:8080/ user=domain\user
Вы должны занять место домен \ пользователь с вашей реальной учетной записью и использовать фактический порт вместо 8080 , например, администратор.
Netsh http add urlacl url=http://+:8123/ user=administrator
« + » - это подстановочный знак, указывающий, что все запросы сетевых адаптеров могут получить доступ к этому URL.
Вот официальный документ об этом инструменте.
https://docs.microsoft.com/en-us/windows/desktop/Http/netsh-commands-for-http
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.