C# windows service - expose web interface

天涯浪子 提交于 2020-07-10 09:19:26

问题


I have created a web service that exposes web interface. the service run in console mode and i see the web interface

    public ServiceHost serviceHost = null; public ServiceHost serviceHost = null;;

    private readonly TestService s;
    public Service()
    {


        InitializeComponent();
        s = new TestService();
    }

    protected override void OnStart(string[] args)
    {
        Logger.Info("Start event");
        if (serviceHost != null)
        {
            serviceHost.Close();
        }

        // Create a ServiceHost for the CalculatorService type and 
        // provide the base address.
        string baseAddress = "http://localhost:8000/Service";
        serviceHost = new ServiceHost(typeof(Service1), new System.Uri(baseAddress));
        serviceHost.AddServiceEndpoint(typeof(WindowsServiceTemplate.IService1),
                    new BasicHttpBinding(), baseAddress);

        // Check to see if the service host already has a ServiceMetadataBehavior

        ServiceMetadataBehavior smb = serviceHost.Description.Behaviors.Find<ServiceMetadataBehavior>();
        // If not, add one
        if (smb == null)
            smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
        serviceHost.Description.Behaviors.Add(smb);
        // Add MEX endpoint
        serviceHost.AddServiceEndpoint(
          ServiceMetadataBehavior.MexContractName,
          MetadataExchangeBindings.CreateMexHttpBinding(),
          "mex"
        );



        // Open the ServiceHostBase to create listeners and start 
        // listening for messages.
        serviceHost.Open();
        s.Start();
    }

    protected override void OnStop()
    {

        Logger.Info("Stop event");
        if (serviceHost != null)
        {
            serviceHost.Close();
            serviceHost = null;
        }
        s.Stop();
    }

    protected override void OnShutdown()
    {
        Logger.Info("Windows is going shutdown");
        Stop();
    }


    public void Start()
    {
        OnStart(null);
    }


}

}

and app.config file :

<system.serviceModel>
<services>
  <!-- Note: the service name must match the configuration name for the service implementation. -->
  <service name="WindowsServiceTemplate.IService1" behaviorConfiguration="MyServiceTypeBehaviors" >
    <!-- Add the following endpoint.  -->
    <!-- Note: your service must have an http base address to add this endpoint. -->
    <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mexHttpBinding" />
  </service>
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="MyServiceTypeBehaviors" >
      <!-- Add the following element to your service behavior configuration. -->
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>

the configuration file inside app.config (console application project) i am able to access http://localhost:8000/Service but when i try to call the test method http://localhost:8000/Service/test i get 404 error.

what am i missing?


回答1:


Use Webhttpbinding to create the service and webservicehost to host service. I have made a demo, wish it is useful to you.

public partial class Service1 : ServiceBase
    {
        ServiceHost sh = new ServiceHost(typeof(MyService), new Uri("http://localhost:5900"));
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            if (sh.State==CommunicationState.Opened)
            {
                Log("Service open Fail");
            }
            else
            {
                WebHttpBinding webHttpBinding = new WebHttpBinding();
                ServiceEndpoint se = sh.AddServiceEndpoint(typeof(IService), webHttpBinding, "");
                se.EndpointBehaviors.Add(new WebHttpBehavior());
                sh.Open();
                Log("Service is ready....");
            }
        }

        protected override void OnStop()
        {
            if (sh.State==CommunicationState.Opened)
            {
                sh.Close();
                Log("Service closed successfully");
            }
        }
        private void Log(string text)
        {
            using (StreamWriter sw=new StreamWriter(@"D:\log.txt",true))
            {
                sw.WriteLine($"{text}----Time:{DateTime.Now.ToShortTimeString()}");
            }
        }
        [ServiceContract]
        public interface IService
        {
            [OperationContract]
            [WebGet]
            string SayHello();
        }
        public class MyService : IService
        {
            public string SayHello()
            {
                return "Hello Stranger";
            }
        }
}


Install.
Result.
Here is an official document.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-create-a-basic-wcf-web-http-service
Feel free to let me know if there is anything I can help with.



来源:https://stackoverflow.com/questions/54932401/c-sharp-windows-service-expose-web-interface

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!