2009-07-31 8 views
2

問題が発生して本当に苦労しています。私は、顧客がカスタム・アセンブリを提供して、エンティティ・セーブ・パイプラインにフックするために使用できるWebアプリケーションを今修正しました。これらのカスタムアセンブリは、エンティティがデータベースに保持されているときに反映されます。これらは、すべてのデータアクセスを処理する共通のDALアセンブリを指します。SqlClientPermissionがリフレクションによってロードされたアセンブリで失敗しました。

私はこのシステムが問題なく動作するテストサーバー(Win2k3)を持っています。今度は私のプロダクション・サーバー・クラスター(1つのWin2k3と1つのWin2k8)にプッシュしたので、カスタム・アセンブリーはデータベース(SQL2005)にアクセスするDALメソッドを初めて呼び出すときに爆発します。収集したログ情報は、SqlClientPermissionの取得に失敗したことを示します。ベストプラクティスとは対照的に、私はWebアプリケーションを完全信頼で実行しています。私のカスタムアセンブリは強い名前です。

テストサーバーの設定と本番サーバーの設定の違いをどこから探すことができますか?これは適切なフォーラムではない場合は、どちらですか?

おかげで、 マシュー

+0

データアクセスとそれが返す特定のエラーメッセージを実行するコードスニペットを提供できますか? –

+0

これは長すぎたので、新しい回答として入れました –

答えて

0

ない答えが、私はコメントに置くことができるよりも多くの情報...

それは今、これは私がもはや取得しないので、Win2k8 WIN2K3対問題があるように思われます私たちのクラスタ内のWin2k3サーバからのログの例外。

基本的に、私たちのエンティティがパイプラインチェックを保存して、保存されているエンティティタイプが特定のインターフェイスを実装しているかどうかを確認します。存在する場合、アプリケーションはデータベースにアクセスして、顧客固有の保存前および保存後の機能を実装するクラスのアセンブリおよびクラス名を取得します。これらのアセンブリは、 "アセンブリ"というフォルダ内の "App_Data"フォルダの下にあります。アプリケーションはアセンブリをロードします。リフレクションを使用して、そのアセンブリから適切なクラスをインタフェースとしてインスタンス化し、そのインタフェースでプリおよびポストセーブメソッドを呼び出して、その特定のエンティティタイプのカスタマ固有のアクションを実行します。このカスタムアクションでは、DAL(LLBLGen、FWIWを使用)エンティティクラスを使用してデータベース操作を実行します。

最初の問題は、部分的に信頼できる呼び出し元を許可しないというSecurityExceptionが発生していたため、「AllowPartiallyTrustedCallers」属性で使用されているアセンブリを装飾しました。

私の拡張では、読み込まれるSqlClientPermissionと "Assert()"がインスタンス化されますが、実際には許可されていません(WebアプリケーションはFullTrustで実行されます)。ここであなたが提供できるものは何でも助けを

おかげで...

- マタイ

がスローされます例外の.ToString()出力されます:ここで

Error performing post-save operation on entity 373c595e-843b-45a1-82d0-aa166daf75de of type SS2DAL.EntityClasses.SurveyResponseEntity: SD.LLBLGen.Pro.ORMSupportClasses.ORMQueryExecutionException: An exception was caught during the execution of a retrieval query: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.. Check InnerException, QueryExecuted and Parameters of this exception to examine the cause of this exception. ---> System.Security.SecurityException: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed. 
    at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet) 
    at System.Security.CodeAccessPermission.Demand() 
    at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) 
    at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) 
    at SD.LLBLGen.Pro.ORMSupportClasses.RetrievalQuery.Execute(CommandBehavior behavior) 
The action that failed was: 
Demand 
The type of the first permission that failed was: 
System.Data.SqlClient.SqlClientPermission 
The first permission that failed was: 
<IPermission 
version="1" 
AllowBlankPassword="False"> 
<add KeyRestrictions="" 
KeyRestrictionBehavior="AllowOnly"/> 
</IPermission> 

The demand was for: 
<IPermission 
version="1" 
AllowBlankPassword="False"> 
<add KeyRestrictions="" 
KeyRestrictionBehavior="AllowOnly"/> 
</IPermission> 

The granted set of the failing assembly was: 
<PermissionSet 
version="1"> 
<IPermission 
version="1" 
Access="Open"/> 
<IPermission 
version="1" 
Allowed="ApplicationIsolationByUser" 
UserQuota="512000"/> 
<IPermission 
version="1" 
Flags="Execution"/> 
<IPermission 
version="1" 
Window="SafeTopLevelWindows" 
Clipboard="OwnClipboard"/> 
<IPermission 
version="1" 
PublicKeyBlob="0024000004800000940000000602000000240000525341310004000001000100B55C03865E07BCB230B04EF7D9ACF1E7BF41C618DB1327895C25328446039F51CF237A50989E542D3FA9BB5991D303388C5AAC7AE4E071CD7B42B96B16256FF905EC610107DB2A0872E971253919BA528187489FC89FD083118F562319BF3B66CB79035EC50D2291561D4F2B9733AD5E0ECD9BFF9B80B94C40F5888D4E1C5BDD" 
Name="ProjectHelpers.Extensions" 
AssemblyVersion="2.2009.208.1821"/> 
<IPermission 
version="1" 
Url="file://dc01.bizspeed.datacenter/websites/sitesupervisor files/prjh/ProjectHelpers.Extensions.dll"/> 
<IPermission 
version="1" 
Zone="Internet"/> 
<IPermission 
version="1" 
Level="SafePrinting"/> 
</PermissionSet> 

The assembly or AppDomain that failed was: 
ProjectHelpers.Extensions, Version=2.2009.208.1821, Culture=neutral, PublicKeyToken=4405fd38c7d52787 
The method that caused the failure was: 
SD.LLBLGen.Pro.ORMSupportClasses.EntityBase2 AfterSave(SD.LLBLGen.Pro.ORMSupportClasses.EntityBase2, SD.LLBLGen.Pro.ORMSupportClasses.DataAccessAdapterBase) 
The Zone of the assembly that failed was: 
Internet 
The Url of the assembly that failed was: 
file://dc01.bizspeed.datacenter/websites/sitesupervisor files/prjh/ProjectHelpers.Extensions.dll 
    --- End of inner exception stack trace --- 
    at SD.LLBLGen.Pro.ORMSupportClasses.RetrievalQuery.Execute(CommandBehavior behavior) 
    at SD.LLBLGen.Pro.ORMSupportClasses.DataAccessAdapterBase.ExecuteSingleRowRetrievalQuery(IRetrievalQuery queryToExecute, IEntityFields2 fieldsToFill, IFieldPersistenceInfo[] fieldsPersistenceInfo) 
    at SD.LLBLGen.Pro.ORMSupportClasses.DataAccessAdapterBase.FetchEntityUsingFilter(IEntityFields2 fieldsToFetch, IFieldPersistenceInfo[] persistenceInfos, IRelationPredicateBucket filter) 
    at SD.LLBLGen.Pro.ORMSupportClasses.DataAccessAdapterBase.FetchEntityUsingFilter(IEntity2 entityToFetch, IPrefetchPath2 prefetchPath, Context contextToUse, IRelationPredicateBucket filter, ExcludeIncludeFieldsList excludedIncludedFields) 
    at SD.LLBLGen.Pro.ORMSupportClasses.DataAccessAdapterBase.FetchEntity(IEntity2 entityToFetch, IPrefetchPath2 prefetchPath, Context contextToUse, ExcludeIncludeFieldsList excludedIncludedFields) 
    at SD.LLBLGen.Pro.ORMSupportClasses.DataAccessAdapterBase.FetchEntity(IEntity2 entityToFetch, IPrefetchPath2 prefetchPath) 
    at ProjectHelpers.Extensions.SurveyResponseSaveHelper.AfterSave(EntityBase2 entity, DataAccessAdapterBase adapter) 
    at SS2.RemoteObjects.DataPortal.EntitySaveWithoutRemoting(EntityBase2 entity, AuditSettings auditSettings, AuthTicket at) [NDC:(null)] 
+0

ASP.NETの権限がWin 2K8とWin 2K3のサーバーで同じであることを確認しましたが、異なるプロセスIDで実行されている可能性があります問題。両方のサーバーが同じバージョンのIISですか? –

+0

両方のアプリケーションは、ドメインユーザーであるIDのアプリケーションプールです。 Win2k3サーバーはIIS6で、Win2k8はIIS7です。 (Win2k3上でIIS6をIIS7にアップグレードできますか? –

0

は方法であり、爆弾の反射物の中で:

public EntityBase2 AfterSave(EntityBase2 entity, DataAccessAdapterBase adapter) 
    { 
     SurveyResponseEntity response = entity as SurveyResponseEntity; 

     if (response.IsComplete) // we only really want to do this if the survey has been completed. 
     { 
      SurveyEntity survey = new SurveyEntity(response.SurveyRefId); 
      IPrefetchPath2 questionSetPath = new PrefetchPath2((int)SS2DAL.EntityType.SurveyEntity); 
      IPredicateExpression filter = new PredicateExpression(QuestionSetFields.Current == 1); 
      questionSetPath.Add(SurveyEntity.PrefetchPathQuestionSetCollection, 1, filter) 
       .SubPath.Add(QuestionSetEntity.PrefetchPathQuestionPageCollection) 
        .SubPath.Add(QuestionPageEntity.PrefetchPathQuestionCollection); 

      if (adapter.FetchEntity(survey, questionSetPath)) 
      { 
       // we need to instantiate the survey template save handler from this survey response (if it exists) 
       // then execute 

       if (!String.IsNullOrEmpty(survey.PostSaveAssemblyName) && !String.IsNullOrEmpty(survey.PostSaveClassName)) 
       { 
        try 
        { 
         string assemblyPath = (new FileService()).GetRootAssemblyURL(); 

         Assembly asm = Assembly.Load(File.ReadAllBytes(Path.Combine(assemblyPath, survey.PostSaveAssemblyName))); 

         if (asm != null) 
         { 
          Type t = asm.GetType(survey.PostSaveClassName); 
          ISurveyPostSaveHandler cls = (ISurveyPostSaveHandler)Activator.CreateInstance(t); 
          if (cls != null) 
          { 
           cls.AfterSave(response, survey, adapter); 
          } 
         } 
        } 
        catch (Exception ex) 
        { 
         // at some point, we need to add some logging here. 
         Logger.ErrorFormat("There was an error post-processing survey response {0} from survey {1}: {2}", response.SurveyResponseId, survey.Name, ex.ToString()); 
         throw ex; 
        } 
       } 
      } 
      else 
      { 
       Logger.ErrorFormat("Could not post process response {0} because the parent survey could not be located", response.SurveyResponseId); 
       throw new ApplicationException(String.Format("Could not post process response {0} because the parent survey could not be located", response.SurveyResponseId)); 
      } 
     } 

     return response; 
    } 

    #endregion 
} 
1

私は似たような反射なしで提訴する。私はWin 2k3マシンからWin 2k8にコンパイルされたプロジェクトを移動していました。 - IISでdllの場所にあるbinフォルダーに移動し、右クリックします。 - [権限の編集...]に移動します。 - [全般]タブの一番下に[UnBlock]というボタンが表示されます。

Win 2k8はdllが別の環境からコピーされたようには見えません。

関連する問題