Asp.net mvc 2 FacebookSDK-允许部分受信任的呼叫者问题

Asp.net mvc 2 FacebookSDK-允许部分受信任的呼叫者问题,asp.net-mvc-2,Asp.net Mvc 2,我使用的是FacebookSDK(4.0.2)的最新版本(FacebookSDK.codeplex.com) 我注意到Src代码由几个项目组成,即: (一) 样本->Facebook.Samples.AspWebsite项目 样本->Facebook.Samples.MvcFacebookApp项目 样本->Facebook.Samples.MvcWebsite项目 (二) 测试->Facebook.测试 测试->Facebook.Web.Tests (三) Facebook项目 Faceboo

我使用的是FacebookSDK(4.0.2)的最新版本(FacebookSDK.codeplex.com)

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

(一)

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

(二)

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

(三)

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

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

(一)

样本->Facebook.Samples…

(二)

测试->Facebook.测试…

(三)

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

太好了,现在我在我的Facebook.Samples.MvcFacebookApp项目中添加了对BusinessData项目的引用,并尝试访问我的数据库。但是,我在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

#如果!(SILVERLIGHT | |测试)
[程序集:AllowPartiallyTrustedCallers]
#恩迪夫

似乎是罪魁祸首。据这位微软专家称:

BusinessData具有SecurityCritical级别的权限。我的类TrackUserAttribute.cs仅具有SecurityTransparent,因此无法拥有调用BusinessData程序集中的方法的权限。这是正确的吗

我已经尝试了各种方法来实现这一点,甚至从GlobalAssemblyInfo.cs文件中删除[assembly:AllowPartiallyTrustedCallers],但我发现.edmx文件本身存在另一个问题,即它无法加载元数据,因此我假设它仍然与完全信任权限等有关

我确信这里有一个简单的答案,我确信开发SDK包装器的人会考虑到人们将扩展他们的SDK来满足个人需要。 对于我来说,什么是最好的方法来确保我的数据和任何我想抽象的东西的抽象,而不必将其绑定到提供的项目中

现在,为了继续开发,并且不被束缚太久,我刚刚将我的实体模型(edmx)存储到Facebook.Samples.MvcFacebookApp的models文件夹中。目前这是可行的,但我更愿意将edmx存储在它自己的项目中

干杯
Rob

好的,在我解决了这个问题并开始安装log4net作为我的应用程序的事件记录器之后,我发现了这个网站:

本质上,我想将log4net转换为asp.net4.0,而不是它最初编写的1.0/2.0。然后,在阅读了这篇关于如何让旧的log4net代码在4.0中工作的说明之后,哈哈!时机到了。基本上,他需要做的就是将此属性放入他的AssemblyInfo.cs文件中:


#if !(SILVERLIGHT || TESTS)
[assembly: AllowPartiallyTrustedCallers]
#endif
[程序集: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

好的,所以在我解决了这个问题并开始安装log4net作为我的应用程序的事件记录器之后,我发现了这个站点:

本质上,我想将log4net转换为asp.net4.0,而不是它最初编写的1.0/2.0。然后,在阅读了这篇关于如何让旧的log4net代码在4.0中工作的说明之后,哈哈!时机到了。基本上,他需要做的就是将此属性放入他的AssemblyInfo.cs文件中:


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

因此,我对我的BusinessData项目也做了同样的操作,并在那里更新了AssemblyInfo.cs文件,嘿,它成功了

经过一番深思熟虑,我发现这样做是允许我的Facebook.Samples.MvcFacebookApp拥有部分权限来调用一个SecurityCritical程序集,包括其中包含的那些对象。因此,我现在可以从Mvc应用程序在这个程序集中调用我的edmx(EntityDataModel)

第二个修复程序,目前还不完全清楚为什么需要这样做,但它修复了问题:将App.config文件中的连接字符串复制到Mvc应用程序中的Web.config文件中。出于某种原因,edmx似乎试图从web.config而不是App.config读取连接字符串。所以