FacebookSDK - AllowPartiallyTrustedCallers问题

时间:2010-11-18 03:21:38

标签: asp.net-mvc-2

我正在使用最新版本的FacebookSDK(4.0.2)(facebooksdk.codeplex.com)

我注意到Src代码由几个项目组成:

1)

样品 - > Facebook.Samples.AspWebsite项目
样品 - > Facebook.Samples.MvcFacebookApp项目
样品 - > Facebook.Samples.MvcWebsite项目

2)

测试 - > Facebook.Tests
测试 - > Facebook.Web.Tests

3)

Facebook项目
Facebook.Web项目
Facebook.Web.Mvc项目

好的,我正在构建一个Facebook Canvas .Net 4.0 MVC 2应用程序,我只是使用Facebook.Samples.MvcFacebookApp项目,并根据我的情况替换和添加类和文件。但是,我已经到了我的网站将在Microsoft Azure云上运行的地步,我想将数据层(数据库)抽象到它的项目中。所以我继续在解决方案中创建了一个名为BusinessData的新项目,并为其添加了一个EntityDataModel,所以现在解决方案如下所示:

1)

样品 - > Facebook.Samples ...

2)

测试 - > Facebook.Tests ...

3)

Facebook项目
Facebook.Web项目
Facebook.Web.Mvc项目
BusinessData项目
     - > Business.edmx

很好,现在我将BusinessData项目的引用添加到我的Facebook.Samples.MvcFacebookApp项目并尝试访问我的数据库。但是,我在Facebook.Samples.MvcFacebookApp项目的TrackUserAttribute.cs类中收到此错误:


System.MethodAccessException occurred
  Message=Attempt by security transparent method 'Facebook.Samples.MvcFacebookApp.Models.TrackUserAttribute..ctor()' to access security critical method 'BusinessData.BusinessEntities..ctor()' failed.

Assembly 'Facebook.Samples.MvcFacebookApp, Version=4.0.2.0, Culture=neutral, PublicKeyToken=null' is marked with the AllowPartiallyTrustedCallersAttribute, and uses the level 2 security transparency model.  Level 2 transparency causes all methods in AllowPartiallyTrustedCallers assemblies to become security transparent by default, which may be the cause of this exception.
  Source=Facebook.Samples.MvcFacebookApp
  StackTrace:
       at Facebook.Samples.MvcFacebookApp.Models.TrackUserAttribute..ctor() in C:\Users\rkara\Desktop\FacebookPazooza\ThuziFacebookSDK\Source\Src\Facebook.Samples.MvcFacebookApp\Models\TrackUserAttribute.cs:line 13
  InnerException:

经过一些平庸的研究,并且没有完全了解CAS政策以及ASP.Net 4.0如何发展,我的理解是,FacebookSDK解决方案的所有项目中包含的GlobalAssemblyInfo.cs文件都与它有关

GlobalAssemblyInfo.cs文件中的这行代码:


#if !(SILVERLIGHT || TESTS)
[assembly: AllowPartiallyTrustedCallers]
#endif

似乎是罪魁祸首。根据这位微软专家的说法:

http://www.simple-talk.com/dotnet/.net-framework/whats-new-in-code-access-security-in-.net-framework-4.0---part-i/

BusinessData具有SecurityCritical级别权限。我的类TrackUserAttribute.cs只有SecurityTransparent,因此不能没有调用BusinessData程序集中的方法的权限。这是对的吗?

我已经尝试了各种各样的事情,甚至从GlobalAssemblyInfo.cs文件中删除[assembly:AllowPartiallyTrustedCallers],但我的.edmx文件本身又说它无法加载元数据的另一个问题,所以我认为它仍然与完全信任特权等有关。

我确信这有一个简单的答案,并且我确信开发此SDK包装器的人会考虑这样一个事实:人们将扩展他们的SDK以满足个人需求。

对于我来说,确保抽象我的数据以及我想要抽象的任何其他内容而不必将其与所提供的项目联系起来的最佳方法是什么?

就目前而言,继续开发并且不会被束缚太长时间我只是将我的实体模型(edmx)存储到Facebook.Samples.MvcFacebookApp的models文件夹中。这暂时有用,但我更愿意将edmx存储在自己的项目中。

干杯 罗布

1 个答案:

答案 0 :(得分:1)

好的,所以在我离开这个问题并转而安装log4net作为我的应用程序的事件记录器后,我遇到了这个网站:

http://it.toolbox.com/blogs/daniel-at-work/using-log4net-in-cnet-26794

基本上我想将log4net转换为asp.net 4.0,而不是最初编写的1.0 / 2.0。然后在阅读了这些家伙关于他如何获得旧的log4net代码以便在4.0中工作的说明!那一刻来了。基本上他需要做的就是将这个属性放入他的AssemblyInfo.cs文件中:

[assembly:AllowPartiallyTrustedCallers]

所以我为我的BusinessData项目做了同样的事情,并在那里更新了AssemblyInfo.cs文件,嘿它已经工作了!

经过深思熟虑之后,我认为这样做可以让我的Facebook.Samples.MvcFacebookApp部分特权来调用SecurityCritical程序集,包括其中包含的那些对象。因此,我现在可以继续从Mvc应用程序中调用此程序集中的edmx(EntityDataModel)。

第二个修复并且不完全知道为什么这是必要的但它修复了问题是将连接字符串从App.config文件复制到Mvc应用程序中的Web.config文件。出于某种原因,edmx似乎试图从web.config而不是连接字符串的App.config中读取。所以现在我在App.config和Web.config文件中有相同的连接字符串。

咩!它很有效,我很高兴......继续前进!

: - d