elmah -asp.net-> 다중 연결 문자열 -> 코드에서 SQL 오류 로그 연결 문자열 설정
-
22-08-2019 - |
문제
나는 통합을 찾고있다 엘마 기존 ASP.NET 응용 프로그램으로 오류 조사를 추가로 지원하고 연결 문자열에 도움을 줄 수 있습니다. 우리는 응용 프로그램이 배포 된 모든 환경 또는 환경에 단일 web.config 파일을 사용하며 런타임에 앱은 일반적으로 URL을 기반으로하는 환경을 결정합니다.
이것이 표준 블록이 우리에게 좋아하는 것입니다 ...
<connectionStrings>
<add name="TESTAppDB" connectionString="Data Source=SQL-T-APPNAME.COMPANY.COM;Initial Catalog=APPNAME;User ID=USER;Password=THEPASS" providerName="System.Data.SqlClient"/>
<add name="CERTAppDB" connectionString="Data Source=SQL-C-APPNAME.COMPANY.COM;Initial Catalog=APPNAME;User ID=USER;Password=THEPASS" providerName="System.Data.SqlClient"/>
<add name="PRODAppDB" connectionString="Data Source=SQL-P-APPNAME.COMPANY.COM;Initial Catalog=APPNAME;User ID=USER;Password=THEPASS" providerName="System.Data.SqlClient"/>
</connectionStrings>
Elmah를 사용하면 연결 문자열의 이름을 지정하면되지만 런타임에서 어떻게 동적으로 수행 할 수 있습니까? 예를 들어, 테스트하면 다음과 같습니다.
<elmah>
<errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="TESTAppDB"/>
</elmah>
하지만 내가 prod에 있다면 :
<elmah>
<errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="PRODAppDB"/>
</elmah>
편집하다
웹 애플리케이션을위한 배포 관행은 내가하려는 일에 대한 범위가 좋지 않습니다. Elmah SQL 오류 로그의 데이터 소스를 변경할 수있는 코드 솔루션이 필요합니다 ...
오늘 웹 앱을 배포하는 방식을 변경할 수 없습니다. 즉, 테스트중인 것이 무엇이든 Cert로 이동합니다. CERT의 내용은 Prod로 이동합니다. 웹 앱은 어떤 환경이 있는지 결정하고 실행할 수 있어야합니다 ...
해결책
Elmah는 오픈 소스이므로 자신의 추가하기 쉽습니다 :-)
당신이해야 할 일은 새로운 정적 속성을 SqlErrorLog
사용하려는 연결 문자열이 포함 된 클래스가 SqlErrorLog.ConnectionString
값이있는 경우 사용자 정의 연결 문자열을 반환 할 속성.
클래스에 이와 같은 것을 추가하십시오 (경고 - 테스트되지 않은 코드) :
public static string CustomConnectionString { get; set; }
public virtual string ConnectionString
{
get
{
if (string.IsNullOrEmpty(CustomConnectionString))
{
return _connectionString;
}
else
{
return CustomConnectionString;
}
}
}
이것으로 충분해야합니다. 이제 연결 문자열을 선택하고 업데이트하여 설정하는 위치를 찾는 것입니다. SqlErrorLog.CustomConnectionString
재산.
다른 팁
이를 위해 웹 배포 프로젝트를 사용합니다. 각 구성에 대해 연결 문자열이있는 파일을 지정할 수 있습니다 (기본적으로 디버그 및 릴리스). 이러한 방식으로 모든 배포에 대한 모든 구성 파일에는 동일한 파일이 있으며 Web.Config는 각 배포에 대해 적절하게 업데이트됩니다.
Scott Gu는 여기에 좋은 정보를 가지고 있습니다. http://weblogs.asp.net/scottgu/archive/2005/11/06/429723.aspx
이전 릴리스를위한 것이지만 정보는 여전히 적용됩니다.
하나의 연결 문자열 이름 "AppDB"를 사용하지만 실제로는 각 환경마다 다른 외부 (web.config 파일 외부) 구성 파일에서 연결 문자열을 호스팅합니다.
web.config에서 :
<connectionStrings configSource="config\connectionStrings.config"/>
그런 다음 ConnectionStrings.config 파일에서 :
<connectionStrings>
<add name="AppDB" connectionString="Data Source=SQL-T-APPNAME.COMPANY.COM;Initial Catalog=APPNAME;User ID=USER;Password=THEPASS" providerName="System.Data.SqlClient"/>
</connectionStrings>
그런 다음 ConnectionStrings.config 파일에 어떤 환경에 따라 ConnectionString을 수정하십시오. 코드에서 "APPDB"만 참조하십시오.
Rune Grimstad의 답변을 구축하려면 그의 변경 외에도 다음을 추가하십시오.
if (connectionString.Length == 0)
connectionString = CustomConnectionString;
후에:
string connectionString = ConnectionStringHelper.GetConnectionString(config);
sqlerrorlog (idictionary config) 생성자에서.
그런 다음 Rsolberg가 한 일을했지만 세션이 아닌 Application_start에서 :
Elmah.sqlerrorlog.customConnectionstring = "귀하의 CS";
이 경우 데이터베이스 컨텍스트에서 사용할 수 있습니까?
MVC 3에 WebApp이 있고 데이터베이스 컨텍스트가있는 데이터베이스에 연결합니다 (위의 예에 따라).
using (var ctx = new TESTAppDB())
{
var res = (from p in ctx.Customer select p).FirstOrDefault();
}
여기서 testAppDB :
public class TESTAppDB: DbContext
{
public DbSet<Customer> Customer{ get; set; }
}
다른 데이터베이스에 연결하려면 다음을 작성합니다.
using (var ctx = new CERTAppDB())
{
var res = (from p in ctx.Order select p).FirstOrDefault();
}
맞는 것 같습니다 ...