根据这个 MSDN关于中等信托的文章, ,在中等信任下:

文件限制是限制的。这意味着您只能在应用程序的虚拟目录层次结构中访问文件。授予您的应用程序的应用程序,以读取,写入,附加和途径为您应用程序的虚拟目录层次结构。

但是,对于我当前的托管提供商,在中等信任下运行应用程序,当我尝试在应用程序的根文件夹中读取/写文件时,我得到了一个 access to path 'myfile.xml' denied 错误。

使用以下代码读取此文件

XElement file = XElement.Load(HttpContext.Current.Server.MapPath("~/myfile.xml"));

更新完整错误:

拒绝访问路径'c: mywebsite myfile.xml'的路径。

描述:执行当前Web请求期间发生了一个未经治疗的异常。请查看堆栈跟踪,以获取有关该错误以及代码中何处的更多信息。

异常详细信息:system.unauthorizedAccessexception:访问路径'c: mywebsite mywebsite myfile.xml'的访问被拒绝。

ASP.NET无权访问请求的资源。考虑授予对ASP.NET请求身份的访问权限。 ASP.NET具有基本进程身份(通常在IIS 5和IIS 6和IIS 7上的网络服务上的{Machine} ASPNET,以及IIS 7.5上的配置应用程序池标识),如果应用程序不模仿该应用程序。如果应用程序通过通过,则身份将是匿名用户(通常是IUSR_MachineName)或已认证的请求用户。

要授予ASP.NET访问文件,请右键单击Explorer中的文件,请选择“属性”,然后选择“安全性”选项卡。单击“添加”以添加适当的用户或组。突出显示ASP.NET帐户,然后选中所需访问的框。

源错误:

在执行当前的Web请求期间生成了一个未经治疗的例外。可以使用下面的异常堆栈跟踪来识别有关异常的原点和位置的信息。

堆栈跟踪:

未经授权的accessexception:访问路径'c: mywebsite myfile.xml'的访问。
System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +12892935 System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs ,字符串msgpath,布尔布普罗克斯(Brolean bfromproxy),布尔uselongpath)+2481
system.io.io.fileStream..ctor(字符串路径,filemode模式,fileaccess访问,文件共享,INT32 bufferSize,fileOptions选项,字符串msgpath,boolean bfromproxy)+229 +229 system.io.io.io.fileStream.ctor..ctor..ctor..ctor(字符串路径,filemode Mode,filemode Mode,filemode Mode,filemode Mode,filemode Mode,filemode Mode,filemode Mode, fileaccess访问,文件共享)+102
system.xml.xmlWriterSettings.CreateWriter(字符串outputfileName)+5224496
system.xml.linq.xelement.save(字符串文件名,saveOptions选项)+108
mesoboard.services.siteconfig.updatecache()+1971 mesoboard.web.mvcapplication.mvcapplication.onapplicationstartedstarted()+62 ninject.web.mvc.ninignthttpappapplication.application.application.application_start()

httpexception(0x80004005):拒绝访问路径'c: mywebsite myfile.xml'的路径。
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +3985477 System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +191
system.web.httpapplication.initspecial(httpapplicationstate state,methodInfo [] handlers,intptr appcontext,httpcontext上下文)+325 system.web.httppappapplicationfactory.getspecialapplication.getspecialapplications.pecialapplicatime.ptprext +pptrext +pptrext +pptrext(intptrext) intptr appContext)+375

httpexception(0x80004005):拒绝访问路径'c: mywebsite myfile.xml'的路径。
system.web.httpruntime.firstrequrestinit(httpcontext上下文)+11524352
system.web.httpruntime.ensurefirstrequrestinit(httpcontext上下文)+141
system.web.httpruntime.processrequestnotificationprivate(iis7workerRequest WR,httpcontext上下文)+4782309

有帮助吗?

解决方案

您需要确保运行网站的应用程序池的用户帐户已对文件/文件夹进行读取/写入权限。默认情况下,我认为您应该具有阅读权限,但不编写权限。另外,出于安全原因,将该文件从wwwroot文件夹中移出到无法破坏整个应用程序的东西可能是一个好主意。

WebDir/数据
webdir/data/myfile.xml

WebDir/wwwroot
webdir/wwwroot/default.aspx

其他提示

您的IO许可听起来像是您文件的权限问题。我知道,每当我将文件上传到托管提供商时,我都必须登录其控制面板并手动提供IIS帐户写入访问权限,因为Read Access是自动授予的唯一许可。

另一方面,XML文件的位置提出了安全问题。尝试将文件放入“〜/app_data/”文件夹中,这是一个特殊的.NET文件夹,比您的数据文件夹更限制 - 目前我可以访问www.yoursite.com/data/myfile.xml并下载它,并下载它,而App_Data文件夹中的任何文件都无法通过网络下载。

Visual Studio中使用的APP_DATA文件夹是什么?

您正在使用Xlement类。命名空间“ system.xml.linq”可能不允许在主机“中级”配置中。要在中等级别的信托中使用LINQ,请遵循以下内容 程序

Medium Trust指定该应用程序仅访问$ AppDir。您可以自定义媒介信任级别,以通过更改fileiopermissions以包含$ appDir以外的其他目录来添加对中信信任的额外访问。但是,我发现当您在定制的媒介信托级别下调用server.mappath(“/”)时,您将获得异常“请求”请求type'system.security.security.permissions.fileiopermissions,mscorlib,mscorlib,version = = 4.0.0.0,文化=中性,publicKeytoken = B77A5C561934E089'失败”

我的理论是,这是因为您要求访问$ appdir之外的文件系统。

我在Godaddy上建立了一个网站,发现我唯一可以启用写入访问的方法是为此启用它 整个网根 但这可能只是该托管计划的限制吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top