3

我们有一些部署到 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)中运行时,此初始化代码会按预期执行并生成日志文件。当我将此 WCF 服务部署到具有 IIS7.5 的 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 上运行。

4

0 回答 0