【问题标题】:IIS 7.5 - Windows Server 2008 - File upload 405 error. Code works in windows 2003 serverIIS 7.5 - Windows Server 2008 - 文件上传 405 错误。代码在 Windows 2003 服务器中工作
【发布时间】:2015-01-30 00:28:08
【问题描述】:

我遇到了以下代码在 Windows 2003 机器上运行的问题,现在我们正在升级到 2008 并且它不再运行。当代码到达 getResponse() 时,它给了我一个 405 错误。

我正在通过 IIS 写入虚拟目录。
我也试过把它变成一个应用程序,它没有任何区别。 我们没有安装/启用 webdav。

我到处搜索,似乎找不到正确的解决方案来允许我编写文件。

我已经包含了用于上传文件的基本代码...

saveLocation.Length = 0;
saveLocation.Append(Path.GetFileName(files[0]));

   inStream = File.Open(files[0], FileMode.Open);
    HttpWebRequest myWebRequest =    (HttpWebRequest)WebRequest.Create("http://localhost/kw/archive/testFile.pdf");

      myWebRequest.ContentType = contentType;
      myWebRequest.Method = "put";
      //myWebRequest.Headers.Add("action", "put");
      myWebRequest.Headers.Add("filename", saveLocation.ToString());
      myWebRequest.ContentLength = inStream.Length;

      dataToRead = (int)inStream.Length;
      outStream = myWebRequest.GetRequestStream();

      while (dataToRead > 0) {
        if (Response.IsClientConnected) {
          length = inStream.Read(buffer, 0, 10000);
          outStream.Write(buffer, 0, length);
          buffer = new Byte[10000];
          dataToRead = dataToRead - length;
        }
        else {
          dataToRead = -1;
        }
      }

      HttpWebResponse myWebResponse = (HttpWebResponse)myWebRequest.GetResponse();

      myWebResponse.Close();
      inStream.Close();
      outStream.Close();

更新:我目前收到 405 错误。

【问题讨论】:

  • 你能发布更多的错误细节吗?
  • 我收到 405 错误。我已经尝试了所有方法,但无法弄清楚是什么阻止了请求。如果有帮助,则不会安装 WebDav。
  • 您是否启用了失败的请求跟踪?如果是这样,您可以从日志中发布事件数据吗?

标签: c# asp.net iis file-upload


【解决方案1】:

405 错误意味着方法不允许。在上面的代码中,您使用的是“PUT”方法,我认为这种方法在 IIS 中是不允许的。尝试启用它,然后检查它。如果您知道如何启用此功能,请尝试一下;如果您不知道,请查看此link。我希望这能解决您的问题。

【讨论】:

    【解决方案2】:

    405 表示方法不允许 - 最可能的原因是 PUT 动词未被通过 IIS 设置允许。我相信这是一个在 IIS6 和 IIS7 之间加强的安全设置,因为现在默认阻止 PUT 和 DELETE 请求。

    要在站点设置下的 IIS 管理器中启用 PUT 请求,有一个标有请求过滤的图标。如果您打开它,您将看到许多选项卡,其中一个称为 HTTP VERBS,切换到此。从右侧的 Actions Panel 中选择 Allow Verb,然后在出现的对话框中输入 PUT 并选择 OK。

    或者,您可以将以下内容添加到您的 web.config 文件中:

    <security>
        <requestFiltering>
            <verbs allowUnlisted="false">
                <add verb="PUT" allowed="true" />
            </verbs>
        </requestFiltering>
    </security>
    

    如果这不起作用,我们需要更多地了解此呼叫的接收端是什么。接收请求的代码是什么?

    【讨论】:

    • 我已经设置了该属性。我对 StaticFile 处理程序进行了小调整,现在 IIS 返回 200 状态代码,但该文件仍然不存在。
    • 要明确一点,您希望 IIS 从 PUT 请求将文件写入磁盘而无需任何自定义代码?我不认为静态文件处理程序能够写入文件,只是读取它们。
    • 看来你不能再用 WebDAV 来做到这一点support.microsoft.com/kb/2021641/en-us#。您可以使用 WebDAV 进行此操作,但您必须修改您的客户端以验证 blogs.iis.net/robert_mcmurray/archive/2010/02/09/…
    • 是否有不同的处理程序允许写入文件?我们没有安装 WebDAV。
    • 我不这么认为。关于内置模块功能的文档似乎相当缺乏。我能找到的最好的是下面底部的参考部分,准备向下滚动很多:iis.net/learn/get-started/introduction-to-iis/…
    【解决方案3】:

    IIS 6 为其工作进程使用网络服务帐户,IIS 7 使用 DefaultAppPool 身份。

    检查物理文件夹是否具有 DefaultAppPool 标识的写入权限。

    请参阅这篇文章,了解如何将 DeaultAppPool 身份添加到文件夹。

    http://www.iis.net/learn/manage/configuring-security/application-pool-identities

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 2011-09-11
      • 2011-03-18
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多