C# 在Windows服务中调用Web服务
我使用了一个简单的windows服务,使一个方法在特定的时间内工作,效果很好。接下来我已经试过了:C# 在Windows服务中调用Web服务,c#,asp.net,web-services,windows-services,C#,Asp.net,Web Services,Windows Services,我使用了一个简单的windows服务,使一个方法在特定的时间内工作,效果很好。接下来我已经试过了: protected override void OnStart(string[] args) { this.WriteToFile("Simple Service started {0}"); this.ScheduleService(); } protected override void OnStop() { this.WriteToFile("Simple Serv
protected override void OnStart(string[] args)
{
this.WriteToFile("Simple Service started {0}");
this.ScheduleService();
}
protected override void OnStop()
{
this.WriteToFile("Simple Service stopped {0}");
this.Schedular.Dispose();
}
private Timer Schedular;
public void ScheduleService()
{
try
{
Schedular = new Timer(new TimerCallback(SchedularCallback));
string mode = ConfigurationManager.AppSettings["Mode"].ToUpper();
this.WriteToFile("Simple Service Mode: " + mode + " {0}");
//Rest of the code here
}
catch(Exception ex)
{
WriteToFile("Simple Service Error on: {0} " + ex.Message + ex.StackTrace);
//Stop the Windows Service.
using (System.ServiceProcess.ServiceController serviceController = new System.ServiceProcess.ServiceController("SimpleService"))
{
serviceController.Stop();
}
}
}
这是在一个简单的windows应用程序中完成的。所以我要做的是在windows服务中调用web服务(在特定时间运行的特定方法)。我正在构建的应用程序是基于web的,我有点困惑如何将windows服务集成到其中?我是否需要任何替代方案或任何建议将不胜感激
注意:我想知道的是,是否需要在web应用程序中为windows服务创建另一个项目或以任何其他方式来实现?回答您对我的评论的询问 另一种方法是使用包含Windows服务逻辑的IIS自动启动网站。IIS自动启动优于使用Windows服务,因为它包含所有IIS应用程序托管逻辑,包括自动重启和主动资源管理。写得不好的Windows服务可以关闭服务器,但ASP.net IIS托管的应用程序要关闭其主机需要花费很多时间(这几乎是不可能的) 你的自动启动网站不需要对外界开放——它只需要有一个内部定时器,在启动时保持它的活力。请注意,IIS可能会出于各种原因启动和停止web应用程序;但结果是,它将在您的其他web服务应用程序运行时运行。内部计时器可以等待特定的时间来执行调用第二个web服务所需的逻辑 需要记住的关键点是,Windows服务设计为由Windows托管并持续运行的应用程序。IIS应用程序设计为由Windows运行,但仅在调用时运行。IIS自动启动网站概念允许您提供一个“持续运行”的网站,但由健壮的IIS应用程序托管组件托管,而不是直接作为操作系统进程运行 一般来说,人们之所以不这样做,是因为他们不知道这一点,或者希望避免需要IIS基础设施来运行“Windows服务”类型的应用程序,但在您的情况下,您已经支付了使用IIS托管第二个web服务的费用,因此您最好充分利用IIS(并避免Windows服务部署的第二个技术堆栈和部署难题) 因此,我建议在您的情况下优先使用IIS自动启动而不是Windows服务,因为
要从Windows服务应用程序调用web服务,首先要从该web服务生成一个DLL,然后实例化其命名空间。假设您有该web服务的代码和/或知道其命名空间,则可以执行以下命令:
cd C:\Program Files(x86)\Microsoft SDK\Windows\v8.1A\bin\NETFX 4.5.1工具
wsdl/l:CS/protocol:SOAP%svc%?wsdl
其中
%svc%
是您的web服务的URL,即http://localhost:777/MyWebService.asmx
如果代码是VB而不是C#,请将/l:CS
更改为/l:VB
。
这将输出一个可转换为DLL的代理类文件MyWebService.cs
文件从C:\ProgramFiles(x86)\Microsoft SDK\Windows\v8.1A\bin\NETFX 4.5.1 Tools
移动到C:\Windows\Microsoft.NET\Framework\v2.0.50727\
目录cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
csc/t:library%name%.cs/reference:System.Web.Services.dll/optimize
其中,%name%
是类的名称(不带.cs
,因为该命令将附加该名称)。在我们的示例中,我们将使用MyWebService
(对于vb类,将.cs更改为.vb)C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
。您应该会看到在该文件夹中创建的DLL,其名称为类(MyWebService.DLL
)。将此文件复制到服务项目的bin
文件夹。您需要将bin
文件夹设置为包含在项目中,然后右键单击文件夹以添加>现有项。选择DLL。导入后,选择DLL并将其属性更改为:
构建操作:内容复制到输出目录:如果较新,则复制(或始终复制,根据您的喜好)
bin
文件夹中的DLLhttp://localhost:777/MyWebService.asmx
)在名称空间文本框中,给它一些比ServiceReference1
更有意义的东西,但它不应该与MyWebService
(ASMX文件的名称/名称空间)相同。可能是MWS
MWS.MyWebServiceSoapClient webService=new MWS.MyWebServiceSoapClient();
webService.Open();
string someDa