我想这个问题已经在互联网上被问了几百万次,但遗憾的是没有一个解决方案适合我。
我正在编写一个web api服务,我的.net项目中的体系结构使我有不同的层,如数据访问,服务层,javascript web客户端(显然设置为启动项目)等。
我正在使用一个名为MyConfigFile.config
的外部xml配置文件(用于记录),我已将此配置文件包含在javascript Web客户端项目的根目录中,我还在appsetting中添加了配置文件root web.confilg
文件,如下所述。
<appSettings>
<add key="NSLog" value="~\MyConfigFile.config"/>
</appSettings>
我也添加了这一行
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "MyConfigFile.config", Watch = true)]
到AssemblyInfo.cs
和MyConfigFile.config
文件的构建操作是内容,复制到输出目录总是复制
我想记录服务层中存在的控制器类中的错误和信息,我还在app.config文件中添加了整个xml配置文件的内容(这是服务层项目中的一个文件)。但是我没有在服务层AssemblyInfo.cs
中添加任何内容(我为AssemlyInfo.cs
对上面提到的Web客户端项目的方式)。
然后我使用以下方法在每个控制器类中配置外部配置文件
ICollection ic = XmlConfigurator.Configure(new FileIinfo("path to external config file"));
为了给FileInfo构造函数提供路径,我使用了百万种方式,比如
ConfigurationManager.AppSettings["MyConfigFile"].ToString()
因为我在我的web.config
文件
然后我用
string path = Server.MapPath("~/MyConfilg.config");
然后我用
string path = HostingEnvironment.ApplicationPhysicalPath + "MyConfigFile";
这些都不会抛出null,但ICollection
接口的“ic”对象始终返回count
zero
。当我在控制台应用程序中执行相同操作时,将配置文件包含在控制台应用程序中,然后将Configure()
方法与外部配置文件的完整物理路径一起用于FileInfo
构造函数参数对象“ic”给了我4分。
为什么“ic”在控制台应用程序中给我一些计数,为什么不在Web服务的控制器类中。我应该如何为FileInfo的构造函数参数提供路径值,以便“ic”对象应该开始给我一些计数值。