AppInitialize不在WIndows Server 2012上的WCF服务应用程序中触发

时间:2016-04-21 20:12:44

标签: wcf iis-8 window-server

我们有一些部署到Windows Server 2012的WCF服务应用程序。

在这些服务中,/ app_code /文件夹中有一个名为Initializer的类。这个课程如下;

    public class Initializer
{
    public static MicroserviceInitilization.MSInit iInit = null;

    public static void log_string(string line)
    {

        //if (String.IsNullOrEmpty(app_path))
        //{
        //  return;
        //}

        System.Text.StringBuilder sb = new StringBuilder();
        sb.Append(line + Environment.NewLine);
        String log_path = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
        File.AppendAllText(log_path + "log.txt", sb.ToString());
        sb.Clear();
    }
    public static void AppInitialize()
    {

        log_string("AppInitialize called");
        // This will get called on startup
        MicroserviceInitilization.MSInit iInit = new MicroserviceInitilization.MSInit(ConfigurationManager.AppSettings["log_directory"], ConfigurationManager.AppSettings["service_endpoint_name"]);
    }
}

当此应用程序在我的本地开发环境(Windows7上的IIS7)中运行时,将按预期执行此初始化代码并生成日志文件。当我使用IIS7.5将此WCF服务部署到Windows 2008R2服务器时,初始化代码按预期方式触发。

将相同的应用程序部署到我们的Windows 2012生产环境时, 服务按预期工作,但没有触发初始化代码 ;没有日志文件& MSInit中的其他初始化代码没有显示已执行的记录。

我们尝试在此服务器上使用IIS8的“应用程序初始化”功能,但似乎没有任何明显的效果。

为了尝试其他事情,我更改了初始化代码以使用像这样的ServiceHostFactory模式;

    public class CBHMicroservice : ServiceHostFactory
{

    public static void log_string(string line)
    {

        //if (String.IsNullOrEmpty(app_path))
        //{
        //  return;
        //}

        System.Text.StringBuilder sb = new StringBuilder();
        sb.Append(line + Environment.NewLine);
        String log_path = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
        File.AppendAllText(log_path + "log.txt", sb.ToString());
        sb.Clear();
    }

    public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses)
    {
        log_string("CreateServiceHost called");
        log_string(ConfigurationManager.AppSettings["log_directory"]);
        log_string(ConfigurationManager.AppSettings["service_endpoint_name"]);
        MicroserviceInitilization.MSInit iInit = new MicroserviceInitilization.MSInit(ConfigurationManager.AppSettings["log_directory"], ConfigurationManager.AppSettings["service_endpoint_name"]);
        iInit.log_string("CreateServiceHost called");
        // return new ServiceHost(typeof(Initializer), baseAddresses);
        return new ServiceHost(typeof(CBH.IDProofing.KBAUsersService.KBAUsers), baseAddresses);
    }
}

和我的.svc文件看起来像这样;

<%@ ServiceHost Language="C#" Debug="true" Service="CBH.IDProofing.KBAUsersService.KBAUsers" CodeBehind="KBAUsers.svc.cs" Factory="CBH.IDProofing.KBAUsersService.App_Code.CBHMicroservice" %>

再次:在本地,此代码按预期触发,并且正在创建所需的日志文件,并且日志文件中的条目是正确的。

上面代码中显示的log_string函数会将日志文件放在与.svc文件相同的路径中。 MicroserviceInitilization DLL中存在相同的log_string函数,但它会记录到已定义的文件夹中。

此时,我们不知道为什么这些服务适用于除2012之外的所有其他Windows版本。

0 个答案:

没有答案