2009-03-17 3 views
1

この質問は少し具体的です(MOSS2007)、私は答えが得られることを期待していませんが、運が私に微笑んでくれるでしょう。Webパーツがコンストラクタで初めてページに追加されたときに失敗するのはなぜですか?

ページに追加されているのは、以外のウェブパーツです。私はSQLサーバへの接続を開こうとしているときに、コンストラクタの中に例外をスローします。 SqlClientPermissionアクセス許可の要求が失敗します。私はそれが動作すると言う、私はそれが任意の点に適切に登録され、その後の呼び出しを含む他のすべてのケースで動作することを意味します。

誰かが脱出できないと言いました。理由を知りたいそれは設計によるのですか?

私は可能な限り完全に信頼できるようになりました(私のサーバにあるの.configファイルをに変更しました)が、役に立たなかった。

SharePointは、初めてWebパーツを追加するときに何らかのリモーティングを行っているようです。これは、初めて構築されたときに最小限の信頼性で実行されるように見えます(ASP.Netのweb_minimaltrust.configで定義されているものと同じです)。すべてのものにすべてのアクセス許可を付与しようとした結果、何の効果もありませんでした。

私の解決策は、データアクセスコードをOnInitメソッドに移動することでしたが、それは刺激的です。誰にも洞察はありますか?

ありがとうございます。

デバッガからの追加情報。

のみ許可権限は以下のとおりであった:

<PermissionSet class="System.Security.PermissionSet" version="1"> 
    <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="Execution"/> 
    <IPermission class="System.Web.AspNetHostingPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Level="Minimal"/> 
</PermissionSet> 

内部例外スタック:

hresult = -2146233078 
mscorlib 
at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet) 
at System.Security.PermissionSet.Demand() 
at System.Data.Common.DbConnectionOptions.DemandPermission() 
at System.Data.SqlClient.SqlConnection.PermissionDemand() 
at System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection) 
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
at System.Data.SqlClient.SqlConnection.Open() 
at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user) 
at System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe() 
at System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode() 
at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) 
at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression) 
at System.Linq.Queryable.Count[TSource](IQueryable`1 source) 
at IManageDocumentsPart.ClientSideDocumentsWebPart.GetOfficeCode(Int32 employeeId) 
at IManageDocumentsPart.ClientSideDocumentsWebPart..ctor() 

フルスタック:

IManageDocumentsPart.DLL!IManageDocumentsPart.ClientSideDocumentsWebPart.ClientSideDocumentsWebPart() Line 98 C# 
[Native to Managed Transition]  
[Managed to Native Transition]  
mscorlib.dll!System.RuntimeType.CreateInstanceSlow(bool publicOnly, bool fillCache = true) + 0x68 bytes  
mscorlib.dll!System.Activator.CreateInstance(System.Type type, bool nonPublic) + 0x43 bytes  
System.Web.dll!System.Web.HttpRuntime.FastCreatePublicInstance(System.Type type) + 0x56 bytes  
System.Web.dll!System.Web.UI.WebControls.WebParts.WebPartManagerInternals.CreateObjectFromType(System.Type type) + 0x7 bytes  
System.Web.dll!System.Web.UI.WebControls.WebParts.WebPartManager.ImportWebPart(System.Xml.XmlReader reader = {EndElement, Name="metaData"}, out string errorMessage = null) + 0x35d bytes  
Microsoft.SharePoint.dll!Microsoft.SharePoint.WebPartPages.SPWebPartManager.ImportWebPartBase(System.Xml.XmlReader reader = {EndElement, Name="metaData"}, string importErrorMessage = "Cannot import this Web Part.", out string errorMessage = null) + 0x25 bytes  
Microsoft.SharePoint.dll!Microsoft.SharePoint.WebPartPages.WebPartImporter.CreateWebPart(bool clearConnections = true) + 0x1b4 bytes  
Microsoft.SharePoint.dll!Microsoft.SharePoint.WebPartPages.WebPartImporter.Import(Microsoft.SharePoint.WebPartPages.SPWebPartManager manager = {Microsoft.SharePoint.WebPartPages.SPWebPartManager}, System.Xml.XmlReader reader = {None}, bool clearConnections = true, System.Uri webPartPageUri = {http://v-sp2007/testsite/default.aspx?PageView=Shared}, Microsoft.SharePoint.SPWeb spWeb = {Microsoft.SharePoint.SPWeb}) + 0x8e bytes  
Microsoft.SharePoint.dll!Microsoft.SharePoint.WebPartPages.WebPartImporter.Import(Microsoft.SharePoint.WebPartPages.SPWebPartManager manager = {Microsoft.SharePoint.WebPartPages.SPWebPartManager}, System.Xml.XmlReader reader = {None}, bool clearConnections = true, Microsoft.SharePoint.SPWeb spWeb = {Microsoft.SharePoint.SPWeb}) + 0xa1 bytes  
Microsoft.SharePoint.dll!Microsoft.SharePoint.WebPartPages.WebPartQuickAdd.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(string eventArgument = "http%253A%252F%252Fv%252Dsp2007%252F%255Fcatalogs%252Fwp%252FClientSideDocumentsWebPart%252Ewebpart;ClientSideDocumentsWebPart") + 0x288 bytes  
System.Web.dll!System.Web.UI.Page.RaisePostBackEvent(System.Web.UI.IPostBackEventHandler sourceControl, string eventArgument) + 0xc bytes  
System.Web.dll!System.Web.UI.Page.RaisePostBackEvent(System.Collections.Specialized.NameValueCollection postData) + 0xb2 bytes  

...スタックの残りの部分はあります通常はページを開くときと同じです。

答えて

1

hereウェブパーツコンストラクタのコードにはNO-NOとマークされている記事の多くがあります。

+0

とはい。すべてのセキュリティオブジェクトが正しく設定されていないコンストラクタが最初に呼び出された可能性があります。 – superjos

1

これは奇妙です。おそらく、ページが編集/デザインモードになっているときにデータベース呼び出しを行わないようにする特別なケースがあります。あなたの問題を解決するだろうか?

+0

私はそれを行うことができると思います。私が言及したように、コードをOnInitに移動し、それを "固定"しました。私はすべてを許可したときに最小のパーミッションのセットでコンストラクタを実行する理由を知りたいだけです。 – Ruslan

2

コードアクセスセキュリティ設定を展開するソリューションパッケージをセットアップしてみてください。あなたは間違いなくSqlClientPermissionが必要です。詳細はCode Access Security for web partsの投稿をご覧ください。

+0

ありがとうございます。しかし、私は持っています。私はそれを試してみた。ここで問題となるのは、CASが正しく構成されていないということではありません。 SharePointは、最初にWebパーツを追加するときに、すべての構成を無視し、w/minの信頼性で実行します。 – Ruslan

1

簡単なテストとして、Webパーツを含むアセンブラをGALにデプロイすることができます。そこでは完全信頼で実行されます。

個人的には、魅力的な理由がない限り、Webパーツのコンストラクタでデータベース接続を確立することはお勧めしません。

[更新3009-03-27]

デバッグが原因を除外については、多くの場合です。 Webパーツがフルトラストで動作しているとは思いますが、GACのケースをテストすることをお勧めします。テストのために.dllをBinディレクトリから削除してください。これは5-10分しかかかりません。はあなたが立っているを知っています。

+0

私はGALをまだ試していません.WebパーツはFullTrustで動作しているので、初めて追加したときではありません。試してみます。特定のデザイン時プロパティはユーザー固有のデータに依存するため、コンストラクターでDBにアクセスします。ただし、DBだけでなく、特権メソッドが失敗します。 – Ruslan

1

私の解決策は、データアクセスコードをOnInitメソッドに移動することでしたが、それは刺激的です。誰にも洞察はありますか?

SharePointが処理を開始し、要求を処理するとき、最初に行うことはコンストラクタを実行してオブジェクトの新しいインスタンスを作成することです。それが呼び出すコンストラクタはパラメータなしなので、インポート/エクスポートのためにシリアライズおよびデシリアライズできます。コンストラクタの内部では、新しく作成されたオブジェクトには、セキュリティコンストラクトや関連オブジェクトは設定されていません。したがって、あなたのオブジェクトには、それがどこにあるのか、何をしているのかに関するコンテキスト情報がない場合があります。

コードをOnInitメソッドに移動すると、関連するオブジェクトの一部として実行の時刻が戻され、このポイントによって自動的にバインドされなかったものが戻されます。 ASP.netライフサイクルでは、OnInitメソッドは上から下へ、OnLoadメソッドは下から上へと動作します。親や子どもが関連コードをまだ実行しているかどうかにも影響する可能性があります。

関連する問題