我们有一些部署到 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 上运行。