2013-01-19 37 views
26

Mam projekt aplikacji sieci Web ASP.NET, który łączy się ze zdalną bazą danych za pośrednictwem Entity Framework. Podczas debugowania (np. Uruchomienie projektu na moim komputerze lokalnym) adres IP do bazy danych jest inny niż podczas wydania (np. Po przesłaniu projektu na mój serwer internetowy i uruchomieniu go z przeglądarki). Do tej pory zawsze ręcznie zmieniałem ciąg połączenia z bazą danych w pliku Web.config, aby przełączać się między tymi dwoma (w zasadzie musiałem tworzyć ciągi połączeń, jeden o nazwie "Debugowanie" i jeden "Release", a ja po prostu zamieniłem się po nazwach za każdym razem, gdy wdrażałem).Web.config Kompilacja vs Zwolnienie transformacja nie działa

Teraz właśnie zauważyłem, że powinno to być możliwe, aby stało się to automatycznie poprzez Web.config Transformation Syntax, gdzie wstawisz zmodyfikowany ciąg połączenia w wersji Web.Release.config, a następnie powinieneś go użyć, gdy biblioteka DLL jest zbudowana w konfiguracji Release .

Jednak nie wydaje się, aby pracować dla mnie ...

Oto odpowiednia część mojego zwykłego pliku Web.config (które posiada ciąg połączenia Debug dla lokalnego wykorzystania):

<?xml version="1.0"?> 
<configuration> 

    <connectionStrings> 
    <!-- Debug connection string. Release connection string is in Web.Release.config file --> 
    <add name="DatabaseEntities" connectionString="A" providerName="System.Data.EntityClient" /> 
    </connectionStrings> 

</configuration> 

Oto plik Web.Release.config, który według przykładów należy zastąpić ciąg połączenia „DatabaseEntities” „A” z „B”, jeśli biblioteka DLL jest w trybie wydania:

<?xml version="1.0"?> 
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> 

    <!-- Replace the DatabaseEntities connection string with the Release version (local IP address) --> 
    <connectionStrings> 
    <add name="DatabaseEntities" 
     connectionString="B" 
     xdt:Transform="Replace" xdt:Locator="Match(name)"/> 
    </connectionStrings> 

</configuration> 

(Oczywiście "A" i "B" są po prostu uchwytami do rzeczywistych połączeń)

Kiedy debuguję aplikację (np. po prostu naciśnij F5) używany jest domyślny Web.config i mogę uzyskać dostęp do bazy danych. Następnie zmieniam konfigurację kompilacji na Release za pośrednictwem programu Configuration Manager. Wszystkie projekty w rozwiązaniu mają konfigurację Release. Następnie buduję rozwiązanie (tylko przez kompilację lub nawet przez kompletną przebudowę (np. Oczyść, przebuduj)). Przesyłam nowo utworzone biblioteki DLL na serwer WWW, a także pliki Web.config i Web.Release.config, a gdy próbuję uzyskać dostęp do bazy danych, nie jestem w stanie, nadal próbuje uzyskać dostęp do bazy danych poprzez adres IP debugowania i dlatego nie może go znaleźć ...

Wygląda na to, że plik Web.Release.config jest całkowicie ignorowany lub przynajmniej ciąg połączenia nie jest zastępowany.

Co robię źle? Czy składnia transformacji jest niewłaściwa? Czy nie buduję poprawnie aplikacji w trybie Release?

dzięki za pomoc ...

+0

Może to być czasami trochę trudne, jeśli otrzymasz jedno błędne ustawienie, nie będzie działać. Jeśli możesz dodać zrzut ekranu Menedżera konfiguracji, możemy zobaczyć coś, co przeoczyłeś. –

+0

Ten post pomógł mi: [http://stackoverflow.com/questions/3305096/how-can-i-use-web-debug-config-in-the-built-in-visual-studio-debugger-server] [1] [1]: http://stackoverflow.com/questions/3305096/how-can-i-use-web-debug-config-in-the-built-in-visual-studio -debugger-server –

Odpowiedz

51

Then I Build the solution (just via Build or even via a complete rebuild (e.g. Clean, Rebuild)). I upload the newly built DLLs to the webserver, as well as the Web.config and Web.Release.config files

Jest to błąd: transformacje Web config nie będzie pracować dla lokalnego środowiska, jeśli po prostu budować. Musisz opublikować.

Twój proces wdrażania wydaje się dziwny: Kopiujesz tylko DLL, Web.config i web.Release.config. Wydaje mi się, że kopiujesz swój kod źródłowy, a nie skompilowaną aplikację. Opublikowana aplikacja WebApplication nie zawiera pliku web.release.config.

Powinieneś opublikować swój projekt (prawy przycisk na swojej aplikacji internetowej -> Publikuj) do lokalnego systemu plików i skopiuj pliki z tego miejsca lub użyj innej wybranej metody wdrażania.

2 lata temu napisałem artykuł o transformacjach web.config.To daje tutorial krok po kroku dla VS 2010 (Okno opublikować zmieniony w VS 2012): http://www.tomot.de/en-us/article/5/asp.net/how-to-use-web.config-transforms-to-replace-appsettings-and-connectionstrings

+16

Czy istnieje sposób na przekształcenie na kompilacji/F5? Ułatwi to życie. –

+0

Możesz spróbować przypisać skrót do Build.PublishSelection, aby zapisać kilka kliknięć myszką. – citronas

+1

Po prostu publikuję go w folderze C:/Publish, a następnie konfiguruję bazę danych, w której chcę przetestować ustawienia wydania. Możesz ustawić żądanie w ustawieniach pliku "127.0.0.1 published" systemu Windows/system32/drivers/etc/hosts i skonfigurować aplikację w IIS na taką samą (http: // opublikowaną). Następnie publikuj i testuj w dowolnym momencie. – jwize

3

Uważam, że transformacja odbywa się tylko po opublikowaniu witryny/aplikacji. Nie jest to robione podczas budowania aplikacji. Ta ostatnia stale zmieniałaby web.config pod kontrolą źródła (co byłoby prawdziwym kłopotem)

1

Jeśli są to tylko ciągi połączeń, które nie zostały nadpisane podczas transformacji web.config, to właśnie to zrobiłem: Pole wyboru "Użyj tego ciągu połączenia w czasie wykonywania" w sekcji "Ustawienia" kreatora "Publikowanie w sieci". To ustawienie nadpisało transformację web.config ciągu połączenia.

Powiązane problemy