【问题标题】:C# windows service - expose web interfaceC# windows 服务 - 暴露 Web 界面
【发布时间】:2019-07-22 18:20:53
【问题描述】:

我创建了一个公开 Web 界面的 Web 服务。 该服务以控制台模式运行,我看到了 Web 界面

    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);
    }


}

}

和 app.config 文件:

<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>

app.config 中的配置文件(控制台应用程序项目) 我可以访问 http://localhost:8000/Service 但是当我尝试调用测试方法时 http://localhost:8000/Service/test 我收到 404 错误。

我错过了什么?

【问题讨论】:

    标签: c# windows wcf windows-services


    【解决方案1】:

    使用 Webhttpbinding 创建服务和 webservicehost 来托管服务。我做了一个demo,希望对你有用。

    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";
                }
            }
    }
    


    安装。
    结果。
    这是官方文档。
    https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-create-a-basic-wcf-web-http-service
    如果有什么可以帮助的,请随时告诉我。

    【讨论】:

    • 感谢问题是使用 HttpBasicBinding 而不是 webHttpBinding
    • 如果可能,请将其标记为有用,以便其他人愿意看到回复。
    猜你喜欢
    • 2016-02-11
    • 2011-09-13
    • 2021-08-30
    • 2012-12-02
    • 1970-01-01
    • 2019-07-27
    • 2019-01-15
    • 1970-01-01
    • 2016-03-25
    相关资源
    最近更新 更多