C# windows 服务 - 公开 Web 界面 [英] C# windows service - expose web interface
问题描述
我创建了一个公开 Web 界面的 Web 服务.该服务以控制台模式运行,我看到了 Web 界面
public ServiceHost serviceHost = null;public ServiceHost serviceHost = null;;私有只读 TestService s;公共服务(){初始化组件();s = 新测试服务();}受保护的覆盖无效 OnStart(string[] args){Logger.Info("开始事件");如果(服务主机!= null){serviceHost.Close();}//为 CalculatorService 类型创建一个 ServiceHost 和//提供基地址.string baseAddress = "http://localhost:8000/Service";serviceHost = new ServiceHost(typeof(Service1), new System.Uri(baseAddress));serviceHost.AddServiceEndpoint(typeof(WindowsServiceTemplate.IService1),new BasicHttpBinding(), baseAddress);//检查服务主机是否已经有 ServiceMetadataBehaviorServiceMetadataBehavior smb = serviceHost.Description.Behaviors.Find();//如果没有,加一个如果(smb == null)smb = 新的 ServiceMetadataBehavior();smb.HttpGetEnabled = true;smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;serviceHost.Description.Behaviors.Add(smb);//添加 MEX 端点serviceHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,MetadataExchangeBindings.CreateMexHttpBinding(),墨西哥");//打开ServiceHostBase创建监听器并启动//监听消息.serviceHost.Open();s.开始();}受保护的覆盖 void OnStop(){Logger.Info("停止事件");如果(服务主机!= null){serviceHost.Close();服务主机 = 空;}s.停止();}受保护的覆盖 void OnShutdown(){Logger.Info("Windows 即将关闭");停止();}公共无效开始(){OnStart(null);}}
}
和 app.config 文件:
<服务><!-- 注意:服务名称必须与服务实现的配置名称匹配.--><service name="WindowsServiceTemplate.IService1" behaviorConfiguration="MyServiceTypeBehaviors" ><!-- 添加以下端点.--><!-- 注意:您的服务必须有一个 http 基地址才能添加此端点.--><endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mexHttpBinding"/></服务></服务><行为><服务行为><行为名称="MyServiceTypeBehaviors" ><!-- 将以下元素添加到您的服务行为配置中.--><serviceMetadata httpGetEnabled="true"/><serviceDebug includeExceptionDetailInFaults="false"/></行为></serviceBehaviors></行为>
app.config里面的配置文件(控制台应用项目)我可以访问
安装.
结果.
这是官方文档.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-create-a-basic-wcf-web-http-service
如果有什么我可以帮忙的,请随时告诉我.
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?
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.
这篇关于C# windows 服务 - 公开 Web 界面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!