2017-09-26 4 views
0

Webプロジェクトで.ttファイルをコンパイルする前にビルドシステムが更新するURLをweb.configファイルに入力しようとしています。.ttファイル(T4テンプレート)からweb.configからappSettingを読み取るにはどうすればいいですか?

私の.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 

答えて

1

ConfigurationManager.OpenExeConfiguration(path)メソッドを使用して、ハードコーディングされたパスを開くことができます(相対パスを実行できるかどうかはわかりません)。その時点で、返されたConfigurationオブジェクトのAppSettingsプロパティを使用することができます。

+0

私がこれまでにweb.configファイルのパスを見つけることができた:文字列absolutePath = this.Host.ResolvePath( "../../../web.config"); – user230910

+0

私はあなたのソリューションを試しましたが、それは動作しません、私はそれがどこにでもC:\ ProgramFilesの現在のディレクトリにあると考えられる場所にいくつかの制限があると思います – user230910

2

私はファイルが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(); 
} 
+0

私は2つの答えおそらく正しい解決策でしょうか? – user230910

+1

場合によっては、おそらく適切な解決策があります:) – Reddog

+0

アクセス保護レベルのため、設定ファイルとして開いたときにええ、アクセスできませんでした。しかし、XmlDocumentのことはうまくいきました。 – mattnificent

関連する問題