Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Windows服务中调用Web服务_C#_Asp.net_Web Services_Windows Services - Fatal编程技术网

C# 在Windows服务中调用Web服务

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

我使用了一个简单的windows服务,使一个方法在特定的时间内工作,效果很好。接下来我已经试过了:

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服务,因为

  • 您只需要在解决方案中使用技术堆栈,这正是OP所要求的
  • IIS在其所有应用程序上执行主动资源管理,如果这些应用程序无法正常运行,则根据需要终止、重新启动。Windows服务不具备此功能
  • 基于IIS的服务代码是XCOPY可部署的,目标计算机上没有管理员访问凭据
  • 您的IIS服务是可热升级的,无需操作系统级管理员权限-IIS处理升级时的停止和重新启动,您无需执行任何操作

  • 要从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)

  • 通过WINDOWS资源管理器导航到
    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
    。您应该会看到在该文件夹中创建的DLL,其名称为类(
    MyWebService.DLL
    )。将此文件复制到服务项目的
    bin
    文件夹。您需要将
    bin
    文件夹设置为包含在项目中,然后右键单击文件夹以添加>现有项。选择DLL。导入后,选择DLL并将其属性更改为:

    构建操作:内容
    复制到输出目录:如果较新,则复制(或始终复制,根据您的喜好)

  • 右键单击References>addreferences。导航到web服务的
    bin
    文件夹中的DLL

  • 右键单击引用>添加服务引用。假设您的web服务正在运行,获取其完整URL(即
    http://localhost:777/MyWebService.asmx
    )在名称空间文本框中,给它一些比
    ServiceReference1
    更有意义的东西,但它不应该与
    MyWebService
    (ASMX文件的名称/名称空间)相同。可能是
    MWS

  • 在Windows服务中实例化web服务:

    MWS.MyWebServiceSoapClient webService=new MWS.MyWebServiceSoapClient();

    webService.Open();

    string someDa