2017-09-26 1 views
0

Ich versuche, eine URL in der Datei web.config, die das Build-System vor dem Kompilieren der .tt-Dateien in meinem Web-Projekt aktualisiert .Wie kann ich eine App aus web.config von. Tt-Datei (T4 Vorlage) lesen

Die entsprechenden Abschnitte aus meiner .tt Datei sind unten:

<#@ 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"] #>'; 

..... 

Wenn ich versuche, die .ts Datei aus dem .tt Datei ich die folgende Fehlermeldung erhalten zu generieren:

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 

Antwort

1

Sie könnten versuchen, die ConfigurationManager.OpenExeConfiguration(path)-Methode zu verwenden, um einen hartcodierten Pfad zu öffnen (nicht sicher, ob Sie relative Pfade ausführen können). An diesem Punkt können Sie die zurückgegebene Configuration Objekt eigene AppSettings Eigenschaft verwenden.

+0

ich es geschafft habe, so weit die web.config Pfad zu finden: string AbsolutePath = this.Host.ResolvePath ("../../../web.config"); – user230910

+0

Ich habe versucht, Ihre Lösung, aber es funktioniert nicht, ich denke, es gibt einige Einschränkungen für den Speicherort, die es erlaubt ist, zu suchen, und das aktuelle Verzeichnis befindet sich in C: \ ProgramFiles irgendwo – user230910

2

Ich habe den Ansatz der vorgibt, dass die Datei eine XML-Datei und keine Konfigurationsdatei ist. Zuerst finde ich den absoluten Pfad zur web.config, lade ihn und lese den Knoten.

Zuerst werden die Abhängigkeiten:

<#@ 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" #> 

So, hier ist mein Versuch:

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

Ich denke eine Kombination der 2 Antworten ist wahrscheinlich die richtige Lösung? – user230910

+1

Manchmal was auch immer funktioniert ist wahrscheinlich die richtige Lösung :) – Reddog

+0

Ja, ich konnte nicht zugreifen, wenn ich es als eine Konfigurationsdatei öffnete, aufgrund der Zugriffsschutzstufe. Aber die XmlDocument-Sache hat funktioniert. – mattnificent

Verwandte Themen