Laden...

[gelöst] Web.config-Transformation

Erstellt von ProGamer vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.998 Views
P
ProGamer Themenstarter:in
660 Beiträge seit 2008
vor 13 Jahren
[gelöst] Web.config-Transformation

Hallo zusammen,

ich habe die Forensuche bemüht und sogar Dr.Google gefragt aber beide lieferten mit keine Lösung.

ich habe eine Web.config in der alle Einstellungen definiert sind. Zusätzlich habe ich noch
eine Web.Debug.config und Web.Release.config. in diesen beiden Dateien stehen jeweils
verschiedene ConnectionStrings.

in der Web.Config steht folgendes (nur der Wichtigste Teil):


    <connectionStrings>
        <add 
            name="MyDBEntities" 
            connectionString="PlaceHolder"
            providerName="System.Data.EntityClient" />
    </connectionStrings>

In den anderen Dateien steht folgendes (hier nur web.Debug.config)


    <connectionStrings>
        <add
            name="MyDBEntities"
            connectionString="metadata=res://*/MyDataModel.csdl|res://*/MyDataModel.ssdl|res://*/MyDataModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost\SQLEXPRESS;Initial Catalog=MyDB;Integrated Security=True;MultipleActiveResultSets=True&quot;"
            xdt:Transform="SetAttributes(connectionString)" xdt:Locator="Match(name)"
            />
    </connectionStrings>

und laut der MSDN sollte das soweit eigentlich klappen jedoch erhalte ich
bei einer Abfrage immer einen Fehler:

Load operation failed for query 'MyLoadQuery'. Format of the initialization string does not conform to specification starting at index 0

sieht vllt jemand meinen Fehler? (Namen wurden angepasst)

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

S
417 Beiträge seit 2008
vor 13 Jahren

Hi,

hast du dir mal die transformierte web.config mal angesehen?
(findest du unter obj(Release|Debug)\TransformWebConfig\transformed)

Gruß
Daniel

P
ProGamer Themenstarter:in
660 Beiträge seit 2008
vor 13 Jahren

hallo und danke für die antwort.

ja hab ich grade eben mal gemacht. da steht (im falle von Debug) der richtige
ConnectionString. Beim Release steht "PlaceHolder" weil sich im Web.Release.Config
noch nichts befindet. und das Projekt ist auf Debug eingestellt.

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

S
417 Beiträge seit 2008
vor 13 Jahren

Ich denke das problem ist hier:

;provider=System.Data.SqlClient;provider connection

Der zweite provider vor 'connection' muss weg.

P
ProGamer Themenstarter:in
660 Beiträge seit 2008
vor 13 Jahren

ich glaube kaum weil der zweite provider den connection string enthält
und außerdem war genau der selbe ConnectionString im Web.Config auch vorhanden
und da gabs den Fehler nicht.

was ich aber nicht ganz verstehe ist, dass dieser Fehler nur Lokal auftritt.
sobald das Project Published ist und die Seite aufgerufen wird Funktioniert alles.

EDIT:
oder meinst du vllt das hier:

providerName="System.Data.EntityClient"

aus der web.Config?

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

S
417 Beiträge seit 2008
vor 13 Jahren

Oh, sorry hast recht. Der hat schon seine Richtigkeit.

sobald das Project Published ist und die Seite aufgerufen wird Funktioniert alles.

Vielleicht liegt es daran dass beim normalen Build-Vorgang die web.config nicht transformiert wird. Oder hast du das irgendwo in den Build-Events?

P
ProGamer Themenstarter:in
660 Beiträge seit 2008
vor 13 Jahren

hmm in den Build-Events habe ich nichts stehen.
aber mal angenommen ich würde da was reinschreiben, welche Einstellungen werden
dann übernommen? die aus der Web-Transformation oder die ausm Build?

naja als workaround werde ich einfach den ConnectionString wieder in die web.Config
einfügen. Beim Publishen funktionert ja die Transformation und dürfte daher relativ egal
sein.

Danke für die Hilfe soweit!

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

S
417 Beiträge seit 2008
vor 13 Jahren

naja als workaround werde ich einfach den ConnectionString wieder in die web.Config
einfügen. Beim Publishen funktionert ja die Transformation und dürfte daher relativ egal
sein.

Ich mach das auch so, die Web.Debug.config nutze ich auch nicht.

D
615 Beiträge seit 2009
vor 13 Jahren

Hallo

Das Thema ist zwar als gelöst gekenzeichnet, kann mir trotzdem jemand ein vernünftigen Grund geben weshalb dies bei WebApplikationen funktioniert jedoch nicht für WebSites ?

Beste Grüsse

Diräkt

87 Beiträge seit 2006
vor 13 Jahren

Das Thema ist zwar als gelöst gekenzeichnet, kann mir trotzdem jemand ein vernünftigen Grund geben weshalb dies bei WebApplikationen funktioniert jedoch nicht für WebSites ?

Hallo,

die Frage ist einfach zu beantworten.

Der Projekttyp "WebSite" ist so wie er im Projektorder ist schon vollständig. Diese wird in der Regel nicht "gepublished", sondern er wird so wie er ist einfach 1:1 kopiert (mit allem drumm und drann). Binär-Code wird dann erst zur Laufzeit vom IIS erstellt. Der IIS interessiert sich nur für die Web.config. Eine Web.Relase.config o.ä. wird ignoriert. Die nötigen Transformationen werden nie gemacht.

Der Projekttyp "WebApplikationen" ist deutliche mehr als nur eine WebSite. Sie hat grundsätzlich mehr Ähnlichkeit mit einer dll. So verfügt sie über weit mehr "Methadaten". Diese werden bei beim Erstellen des Projektes ausgewertet. Was muss compiliert werden, was wird in den "Ergebnisordner" kopiert, was wird ingnoriert, was wird Teil der dll usw.

Die Transformations-Anweisungen in den Web.*.config's werden vom VS erst bei einem "publishen" ausgewertet und es schreibt eine neue transformierte Web.config für den Ergebnisordner.

Wenn man also genau hinschaut hat man 4 mitunter verschiedene Anwendungen:

  1. In VS im Modus Debug starten. -> Die Debug-Build-Einstellungen für die dll und die Web.config.
  2. In VS im Modus Release starten. -> Die Release-Build-Einstellungen für die dll und die Web.config.
  3. In VS im Modus Debug publischen und dann mithilfe eines IIS starten. -> Die Debug-Build-Einstellungen für die dll und die Web.config + Transformationen der Web.Debug.config.
  4. In VS im Modus Release publischen und dann mithilfe eines IIS starten. -> Die Release-Build-Einstellungen für die dll und die Web.config + Transformationen der Web.Release.config.

(FYI: In den Eigenschaften des Projektes kann unterem Punkt Build eingestellt werden was in welchem Modus (Debug | Relase) gemacht werden soll. Diese Einstellungen haben dann Einfluss auf die generierten "Binär-" bzw. dll-Dateien. Diese und andere Einstellungen kann man bei einer WebSite nicht machen.)

MfG

Tilton

PS: Ich würde einer WebApplication immer den Vorzug geben. WebSite's hab so einige Macken die sehr lästig werden können.

"In der Informatik geht es genauso wenig um Computer wie in der Astonomie um Teleskope."
Edsger W. Dijkstra

The Humble Programmer by Edsger W. Dijkstra

691 Beiträge seit 2007
vor 13 Jahren

Du musst noch explizit über ein Attribut angeben, du das ein Config Transform für einen bestimmten Abschnitt ausführen willst.

Normale web.config

   <connectionStrings>
        <add  name="MyDBEntities" connectionString="PlaceHolder" providerName="System.Data.EntityClient" />
    </connectionStrings>

web.xxx.config:

<connectionStrings xdt:Transform="Replace">
        <add
            name="MyDBEntities"
            connectionString="metadata=res://*/MyDataModel.csdl|res://*/MyDataModel.ssdl|res://*/MyDataModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost\SQLEXPRESS;Initial Catalog=MyDB;Integrated Security=True;MultipleActiveResultSets=True&quot;"
            xdt:Transform="SetAttributes(connectionString)" xdt:Locator="Match(name)"
            />
    </connectionStrings>

Beachte, du das momentan unter VS2010 Probleme bekommst, wenn du XML Nodes ersetzt, in denen die Werte zwischen den Tags und nicht innerhalb von Attributen ersetzt. Bei ersetzen werden nämlich überflüssige Whitespaces oder Linebreaks hinzugefügt. So z.B. beim Ersetzen von den vom Designer ApplicationSettings generierten Properties.
Es wurde seitens Microsoft angekündigt mit VS2010 SP1 diesen Fehler zum beheben.

D.h. die im Designer generierten Properties lassen sich bei VS2010 nicht mit config Transforms ersetzen, ohne dabei eventuell auf Laufzeitfehler zu kommen. (z.B: Emailadressen oder Pfadangaben mit Linebreaks machen keinen Sinn). Um trotzdem Settings zu ersetzen kann man jedoch das ältere appSettings Modell nehmen und sich selber eine Wrapperklasse schreiben, um typisiert auf die appSettings zuzugreifen:

Beispiel:

  <appSettings>
    <add key="Testenvironment" value="true"/>
  </appSettings>

In der Release.config

  <appSettings xdt:Transform="Replace">
    <add key="TestEnvironment" value="false"/>
  </appSettings>
   public class AppSettingsWrapper
    {

        public static bool Testenvironment
        {
            get { return bool.Parse(ConfigurationManager.AppSettings["Testenvironment"].ToString()); }
        }
  }

mit freundlichen Grüßen,
Tomot

Projekte: www.gesellschaftsspieler-gesucht.de

D
615 Beiträge seit 2009
vor 13 Jahren

hallo TiltonJH

besten Dank für deine Antwort !

Der Projekttyp "WebSite" ist so wie er im Projektorder ist schon vollständig. Diese wird in der Regel nicht "gepublished", sondern er wird so wie er ist einfach 1:1 kopiert (mit allem drumm und drann). Binär-Code wird dann erst zur Laufzeit vom IIS erstellt. Der IIS interessiert sich nur für die Web.config. Eine Web.Relase.config o.ä. wird ignoriert. Die nötigen Transformationen werden nie gemacht.

Hm. Also ich compile die Website immer und lade nicht den "Quellcode" hoch.

PS: Ich würde einer WebApplication immer den Vorzug geben. WebSite's hab so einige Macken die sehr lästig werden können.

Absolut ! 100% korrekt ! Ich arbeite seit mehr als einem Jahr an einem grösseren Projekt. Leider habe ich dazumal ne "WebSite" angefangen und nicht eine WebApp. Das konvertieren (gibt tausende Anleitungen) ist auch nicht ganz einfach 😦 (bei mir hats nie wirklich geklappt).

-> Weiss jemand wie ich folgendes erreiche :
---> NAMESPACE überall hinzufügen ? (ohne 1000 dateien von Hand zu öffnen)
(in der "WebSite" wird dieser ja dynamisch erstellt :S

beste Grüsse

Diräkt