读取文件时出错

时间:2010-11-23 21:12:51

标签: asp.net-mvc

当我点击MVC页面上的链接时,我无法打开文件。我收到以下消息。我在代码中添加了模拟。我可以删除并保存文件。

  

拒绝访问路径'\ servername \ folder1 \ folder2 \ folder3 \ foder4 \ filename.pdf'。

     

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

     

异常详细信息:System.UnauthorizedAccessException:拒绝访问路径'......与上面相同....

     

ASP.NET无权访问所请求的资源。考虑将资源的访问权限授予ASP.NET请求标识。 ASP.NET具有基本进程标识(通常是IIS 5上的{MACHINE} \ ASPNET或IIS 6上的网络服务),如果应用程序未模拟,则使用该标识。如果应用程序通过<identity impersonate="true"/>模拟,则标识将是匿名用户(通常为IUSR_MACHINENAME)或经过身份验证的请求用户。

     

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

     

来源错误:

Line 35:         ' This gets executed for every action on this controller
Line 36:         ViewData("READONLY") = IIf(SessionData.IsReadOnly, "Y", "N")
Line 37:         MyBase.Execute(requestContext)
Line 38:     End Sub
Line 39: 
     

源文件:C:\ Posfx \ trunk \ posfx \ camonline \ Controllers \ ApplicationController.vb行:37

     

堆栈追踪:

[UnauthorizedAccessException: Access to the path '\\cambridge-uat-d\NetworkShare\DealDocumentShare\201102\online\136-test file 2.pdf' is denied.]
System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +7716623
System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) +1162
System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) +66
System.Web.HttpResponse.TransmitFile(String filename, Int64 offset, Int64 length) +134
System.Web.HttpResponse.TransmitFile(String filename) +12
System.Web.HttpResponseWrapper.TransmitFile(String filename) +11
System.Web.Mvc.FilePathResult.WriteFile(HttpResponseBase response) +37
System.Web.Mvc.FileResult.ExecuteResult(ControllerContext context) +268
System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +10
System.Web.Mvc.<>c__DisplayClass11.<InvokeActionResultWithFilters>b__e() +20
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +251
System.Web.Mvc.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10() +19
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +251
System.Web.Mvc.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10() +19
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +251
System.Web.Mvc.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10() +19
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +178
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +399
System.Web.Mvc.Controller.ExecuteCore() +126
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +27
Cambridge.Online.ApplicationController.Execute(RequestContext requestContext) in C:\Posfx\trunk\posfx\camonline\Controllers\ApplicationController.vb:37
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +7
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) +151
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) +57
System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) +7
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

1 个答案:

答案 0 :(得分:1)

我认为错误信息不仅仅是明确的,它甚至会告诉你该做什么很少见。您的网站在具有有限权限的特殊帐户下运行。根据您使用的IIS版本,此帐户可能会有所不同。因此,您应该考虑将此帐户的读取权限授予您尝试访问的远程文件夹,根据您获得的例外情况\servername\folder1\folder2\folder3\foder4

您说您已添加模仿,但模拟仅适用于本地资源。在您的情况下,您似乎正在尝试访问远程服务器(远程共享)。在这种情况下,您需要委派而不是模仿。因此,您可以将站点配置为在对此远程共享具有读取权限的域帐户下运行。