带有ASP.NET Webform的IIS7上的FileNotFoundException

时间:2013-01-08 10:46:53

标签: c# asp.net file-upload iis-7 dynamics-crm-2011

在过去的几个小时里,我真的很多地使用了google和stackoverflow,但我没有找到帮助我解决问题的解决方案或主题。

任务和问题:

我创建了一个ASP.NET Webform,它可以在我的本地机器上完美运行。它允许用户在Dynamics CRM 2011中创建客户。在此旁边,用户可以向客户添加注释并添加要上载的文件。

下一步是在IIS7上发布此Webform,以便您可以远程访问它,这位于远程Windows 2008 R2 Server上。如果我现在测试Webform并从FileUpload控件中选择一个数据,IIS7没有获得正确的Path (FileNotFoundException),它总是使用他的根目录而不是数据中的Filepath,即使我想“上传”一个直接从安装了IIS的服务器上提交文件。

堆栈跟踪:

[FileNotFoundException: Die Datei "c:\windows\system32\inetsrv\test.txt" konnte nicht gefunden werden.]
System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +12898679
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, Boolean useLongPath) +2481
System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) +229
System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) +102
System.IO.File.OpenRead(String path) +55
FirstWebform._Default.create_Button_Click(Object sender, EventArgs e) in C:\Users\flah\Documents\Visual Studio 2010\Projects\FirstWebform\FirstWebform\Main.aspx.cs:86
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +154
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3707

我尝试过:

  • 我已经读过,在使用FileUpload.Saveas("C:\\folder\\" + FileUpload.Filename)之前,我必须将文件保存在带有Path.GetFullPath(FileUploadControl.PostedFile.FileName);的临时目录上的IIS7上 但是同样的问题出现了,文件路径是错误的,它没有事件得到它。

  • 我试图通过Server.MapPath();获取路径名,这也不起作用 - 与FileUpload相同

  • 我已在服务器

  • 上设置了用户的权限

我不明白为什么IIS总是使用他的根目录if (FileUpload1.HasFile) { FileStream stream = File.OpenRead(FileUpload1.PostedFile.FileName); byte[] byteData = new byte[stream.Length]; stream.Read(byteData, 0, byteData.Length); stream.Close(); //Dynamics CRM 2011 upload string encodedData = System.Convert.ToBase64String(byteData); newAnnotation.DocumentBody = encodedData; EntityReference refNote = new EntityReference(); refNote.LogicalName = "account"; refNote.Id = newAccountId; newAnnotation.Attributes.Add("objectid", refNote); service.Create(newAnnotation); } else { EntityReference refNote = new EntityReference(); refNote.LogicalName = "account"; refNote.Id = newAccountId; newAnnotation.Attributes.Add("objectid", refNote); service.Create(newAnnotation); } 以及为什么它只能在我的本地机器上正常工作。

没有尝试的重要代码:

{{1}}

我希望有人可以帮助我。也许它只是一点点的配置或我对整个架构的轻描淡写一定是错的。

2 个答案:

答案 0 :(得分:0)

我相信您需要先处理该文件才能使用它。 IIS已收到该文件,并将其保存在临时位置,直到FileUpload1的用户代码处理保存。

我相信您已经尝试过以下代码,但只是为了确保;因为您需要在访问文件之前保存文件。这是执行此操作的标准方法,但您的代码示例不会尝试保存。

尝试以下方法:

String savePath = @"c:\temp\uploads\"; // Save folder - Ensure exists, permissions etc

if (FileUpload1.HasFile)
{
    // Append the name of the file to upload to the path.
    savePath += FileUpload1.FileName;

    // TODO : Error checking - verify file is accepted type/size/does not already exist
    FileUpload1.SaveAs(savePath);

    int fileLen = FileUpload1.PostedFile.ContentLength;
    Byte[] Input = new Byte[fileLen];
    System.IO.Stream myStream = FileUpload1.FileContent;
    myStream.Read(Input, 0, fileLen);

    // TODO : Other Processing

} else {
    // TODO : Handle not hasfile
}

请参阅页面底部的FileUpload on MSDN Library

的一些示例

答案 1 :(得分:0)

您需要使用FileUpload.PostedFile.InputStream来获取实际上传的内容。例如,

if (FileUpload1.HasFile)
{
    var stream = FileUpload1.PostedFile.InputStream;
    byte[] byteData = new byte[FileUpload1.PostedFile.ContentLength];
    stream.Read(byteData, 0, byteData.Length);
    stream.Close();

    ...

编辑:关于您使用现有代码获得的异常,问题在于行File.OpenRead(FileUpload1.PostedFile.FileName); - 您正在尝试在服务器计算机上打开一个带有名称的文件而文件存在于客户端计算机上。因为您没有提到任何路径信息,所以它在某个默认(比如system32)目录中查找文件 - 所以如果客户机和服务器机器是相同的并且文件是从根目录上传的那么代码可以工作但是出于所有实际目的它没用。