2011-08-30 6 views
1

저는 ASP.NET MVC 3.0 웹 사이트를 만들고이 사이트가 개발, 테스트 또는 프로덕션 용인지 여부에 따라 서로 다른 몇 가지 데이터베이스 초기화 방법을 사용합니다. 내가 테스트 사용자를 만들려고 할 때 나는 테스트 초기화에 붙어있다. 일부 프로필 값을 추가하려고하면 사용자가 잘 만들 수 있지만 얻을 수 있습니다. System.Web.HttpException :이 컨텍스트에서는 요청을 사용할 수 없습니다. 요청을 사용할 수없는 상황에서 프로필 값을 추가하는 방법이 있습니까?자동 생성 된 사용자에 대한 프로필 값 추가

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

     if (ApplicationServices.GetInitialCatalog() != "tasktracker") 
     { 
      Database.SetInitializer(new TaskTrackerDropCreateDatabaseIfModelChanges()); 
     } 
     else 
     { 
      Database.SetInitializer(new TaskTrackerCreateDatabaseIfNotExists()); 
     } 

     using (var db = new TaskTrackerContext()) 
     { 
      db.Database.Initialize(false); 
     } 
    } 

public class TaskTrackerDropCreateDatabaseIfModelChanges : DropCreateDatabaseIfModelChanges<TaskTrackerContext> 
{ 
    protected override void Seed(TaskTrackerContext context) 
    { 
     // Set up the membership, roles, and profile systems. 
     ApplicationServices.InstallServices(SqlFeatures.Membership | SqlFeatures.Profile | SqlFeatures.RoleManager); 

     // Create the default accounts and roles. 
     if (ApplicationServices.GetInitialCatalog() == "tasktracker_testing") 
     { 
      if (Membership.GetUser("testuser", false) == null) 
      { 
       Membership.CreateUser("testuser", "password", "[email protected]"); 
       MembershipUser user = Membership.GetUser("testuser", false); 
       user.IsApproved = true; 

       var profile = ProfileBase.Create("testuser"); 
       profile.SetPropertyValue("FirstName", "test"); 
       profile.SetPropertyValue("LastName", "user"); 
       profile.SetPropertyValue("TimeZone", "US Mountain Standard Time"); 
       profile.Save(); 
      } 
     } 
    } 
} 
+0

흥미로운 질문을. 새로운 유니버설 공급자를 사용해 보셨습니까? http : //www.hanselman 같은 httpcontext 문제는 ​​있지만 가치가있을 수 있습니다.co.kr/blog/IntroducingSystemWebProvidersASPNETUniversalProvidersForSessionMembershipRolesAndUserProfileOnSQLCompactAndSQLAzure.aspx –

+0

정말 잘 했어, 정말 고마워! –

+0

다행이었습니다 ... 질문을 닫을 수 있도록 답변을 게시합니다 :) –

답변

0

당신은 ") 초기화 ("의 호출을하려고 했나 :

profile.Initialize(username, true) 

을 한 후 있는지 확인하는 작업을 만듭니다 컨텍스트는 초기화되어야합니다. 그것은 여기서 일하는 것 같다

public void Initialize(string username, bool isAuthenticated) 
{ 
    if (username != null) 
    { 
     this._UserName = username.Trim(); 
    } 
    else 
    { 
     this._UserName = username; 
    } 
    SettingsContext context = new SettingsContext(); 
    context.Add("UserName", this._UserName); 
    context.Add("IsAuthenticated", isAuthenticated); 
    this._IsAuthenticated = isAuthenticated; 
    base.Initialize(context, s_Properties, ProfileManager.Providers); 
} 

의 SettingsContext()가 선언 내 사용자 지정 특성을 고려 보인다 : 반사판을 사용하여

i는 초기화 (아래 참조)의 ProfileBase는 설정과 상황의이 종류를 만들어 보았다 web.config에 있습니다. 나는 사실에서 "초기화()"기능을 추가 한 솔루션이 다른 테스트 후 실제로 실행되지 때문에

안부,

0

다시 돌아와. 그래서 사실 올바르게 작동하는 방법을 찾았습니다.

의 문제로 인해 II7 대신 클래식 모드에서 새로운 응용 프로그램 모드 "통합"을 할 수 귀하의 경우 위해 Application_Start에서 "요청이 컨텍스트에서 사용할 수 없습니다."

좋은 설명을 보려면 마이크 Volodarsky의 블로그 IIS7 Integrated mode: Request is not available in this context exception in Application_Start에 가십시오.

나는 주된 이유 나타낼 수 추출물 붙여 복사/:.

"*이 오류는 위해 Application_Start 이벤트에서 사용할 수 요청 컨텍스트를 만드는 IIS7 통합 파이프 라인의 설계 변경에 기인 클래식을 사용하여 모드 (전용 모드 IIS의 이전 버전에서 실행), Application_Start 이벤트는 항상 응용 프로그램 수명의 글로벌 요청에 얽매이지 이벤트로 구성 된 경우에도 사용할 수하는 데 사용되는 요청 문맥. 그럼에도 불구하고, ASP 때문이다. NET 응용 프로그램은 응용 프로그램에 대한 첫 번째 요청으로 항상 시작되었지만 정적 HttpContext.Current 필드를 통해 요청 컨텍스트에 도달 할 수있었습니다. * "

(210)

은 BeginRequest을 위해 Application_Start에서 첫 번째 요청의 초기화를 이동하고 첫 번째 요청에 요청 별 초기화를 수행하는 해결 방법을 사용하여이 문제를 해결합니다.

코드의 좋은 예

는 자신의 블로그로 수행됩니다

void Application_BeginRequest(Object source, EventArgs e) 

{ 

    HttpApplication app = (HttpApplication)source; 

    HttpContext context = app.Context; 



    // Attempt to peform first request initialization 

    FirstRequestInitialization.Initialize(context); 

} 




class FirstRequestInitialization 

{ 

    private static bool s_InitializedAlready = false; 
    private static Object s_lock = new Object(); 

    // Initialize only on the first request 
    public static void Initialize(HttpContext context) 
    { 
     if (s_InitializedAlready) 
     { 
      return; 
     } 

     lock (s_lock) 
     { 
      if (s_InitializedAlready) 
      { 
       return; 
      } 

      // Perform first-request initialization here 
      // 
      // You can use your create profile code here.... 


      //--- 

      s_InitializedAlready = true; 
     } 
    } 
} 
관련 문제