我们有一些部署到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版本。