如何从 .tt 文件(T4 模板)中读取 web.config 的 appSetting
How can I read an appSetting from web.config from .tt file (T4 Template)
我正在尝试在 web.config 文件中提供一个 URL,构建系统将在我的 Web 项目上编译 .tt 文件之前更新该文件。
我的 .tt 文件中的相关部分如下:
<#@ template debug="true" hostSpecific="true" language="C#" #>
<#@ output extension=".ts" #>
<#@ Assembly Name="System.Core.dll" #>
<#@ Assembly Name="System.Configuration.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Configuration" #>
<#@ import namespace="System.Collections.Specialized" #>
import { Injectable } from "@angular/core";
<#= RegisterNameSpace("Server.Web.Dashboard.Models.APIRequest") #>
<#= RegisterNameSpace("Server.Web.Dashboard.Models.APIResponse") #>
<#= RegisterNameSpace("Server.Web.Dashboard.Models.APIGeneric") #>
<#= RegisterNameSpace("Server.Data.POCODataObjects") #>
@Injectable()
export class WebServiceCommunicatorService {
rootUrl : string = '<#= ConfigurationManager.AppSettings["ServerServiceURL"] #>';
.....
当我尝试从 .tt 文件生成 .ts 文件时,我收到以下错误消息:
Severity Code Description Project File Line Suppression State
Error An expression block evaluated as Null
System.ArgumentNullException: Value cannot be null.
Parameter name: objectToConvert
at Microsoft.VisualStudio.TextTemplating.ToStringHelper.ToStringWithCulture(Object objectToConvert)
at Microsoft.VisualStudio.TextTemplatingF553823B88CD6076D80EB08F6EA809752D0E5DC3E61C0FA53FB2F9AC22ACABF3B7BB9C8801A54E5DBC2A556C03FA42F2EA2AFCE58B708BEC94B0968193987868.GeneratedTextTransformation.TransformText() in webservicecommunicator.service.tt:line 35 Dashboard webservicecommunicator.service.tt 35
您可以尝试使用 ConfigurationManager.OpenExeConfiguration(path)
method to open a hard-coded path (not sure if you can do relative paths). At that point you can use the returned Configuration
object's own AppSettings
属性.
我采用了假装该文件是 XML 文件而不是配置文件的方法。首先我找到 web.config 的绝对路径,然后加载它并读取节点。
首先是依赖关系:
<#@ Assembly Name="System.Web.dll" #>
<#@ Assembly Name="System.Configuration.dll" #>
<#@ assembly name="System.Xml" #>
<#@ import namespace="System.Configuration" #>
<#@ import namespace="System.Web.Configuration" #>
<#@ import namespace="System.Collections.Specialized" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.IO" #>
所以这是我的尝试:
string GetWebServiceUrl() {
XmlDocument doc = new XmlDocument();
string absolutePath = this.Host.ResolvePath("../../../web.config");
doc.Load(absolutePath);
XmlNode node = doc.DocumentElement.SelectSingleNode("/configuration/appSettings/add[@key='ServerServiceURL']");
return node.Attributes["value"].Value.ToString();
}
添加 System.Configuration 程序集并将其导入到您的模板文件中,如下所示。这将允许您使用 ConfigurationManager 引用 AppSettings。
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Configuration" #>
<#@ import namespace="System.Configuration" #>
<#
var myVariable = ConfigurationManager.AppSettings["MyConfigSetting"];
... more code here
#>
我正在尝试在 web.config 文件中提供一个 URL,构建系统将在我的 Web 项目上编译 .tt 文件之前更新该文件。
我的 .tt 文件中的相关部分如下:
<#@ template debug="true" hostSpecific="true" language="C#" #>
<#@ output extension=".ts" #>
<#@ Assembly Name="System.Core.dll" #>
<#@ Assembly Name="System.Configuration.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Configuration" #>
<#@ import namespace="System.Collections.Specialized" #>
import { Injectable } from "@angular/core";
<#= RegisterNameSpace("Server.Web.Dashboard.Models.APIRequest") #>
<#= RegisterNameSpace("Server.Web.Dashboard.Models.APIResponse") #>
<#= RegisterNameSpace("Server.Web.Dashboard.Models.APIGeneric") #>
<#= RegisterNameSpace("Server.Data.POCODataObjects") #>
@Injectable()
export class WebServiceCommunicatorService {
rootUrl : string = '<#= ConfigurationManager.AppSettings["ServerServiceURL"] #>';
.....
当我尝试从 .tt 文件生成 .ts 文件时,我收到以下错误消息:
Severity Code Description Project File Line Suppression State
Error An expression block evaluated as Null
System.ArgumentNullException: Value cannot be null.
Parameter name: objectToConvert
at Microsoft.VisualStudio.TextTemplating.ToStringHelper.ToStringWithCulture(Object objectToConvert)
at Microsoft.VisualStudio.TextTemplatingF553823B88CD6076D80EB08F6EA809752D0E5DC3E61C0FA53FB2F9AC22ACABF3B7BB9C8801A54E5DBC2A556C03FA42F2EA2AFCE58B708BEC94B0968193987868.GeneratedTextTransformation.TransformText() in webservicecommunicator.service.tt:line 35 Dashboard webservicecommunicator.service.tt 35
您可以尝试使用 ConfigurationManager.OpenExeConfiguration(path)
method to open a hard-coded path (not sure if you can do relative paths). At that point you can use the returned Configuration
object's own AppSettings
属性.
我采用了假装该文件是 XML 文件而不是配置文件的方法。首先我找到 web.config 的绝对路径,然后加载它并读取节点。
首先是依赖关系:
<#@ Assembly Name="System.Web.dll" #>
<#@ Assembly Name="System.Configuration.dll" #>
<#@ assembly name="System.Xml" #>
<#@ import namespace="System.Configuration" #>
<#@ import namespace="System.Web.Configuration" #>
<#@ import namespace="System.Collections.Specialized" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.IO" #>
所以这是我的尝试:
string GetWebServiceUrl() {
XmlDocument doc = new XmlDocument();
string absolutePath = this.Host.ResolvePath("../../../web.config");
doc.Load(absolutePath);
XmlNode node = doc.DocumentElement.SelectSingleNode("/configuration/appSettings/add[@key='ServerServiceURL']");
return node.Attributes["value"].Value.ToString();
}
添加 System.Configuration 程序集并将其导入到您的模板文件中,如下所示。这将允许您使用 ConfigurationManager 引用 AppSettings。
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Configuration" #>
<#@ import namespace="System.Configuration" #>
<#
var myVariable = ConfigurationManager.AppSettings["MyConfigSetting"];
... more code here
#>