【问题标题】:write a file from webservices从 web 服务写入文件
【发布时间】:2025-11-21 02:15:02
【问题描述】:

我有一个使用 .net c# 的 Web 服务,我想写入服务器上的文本文件,但我无法让它工作。我相信这是一个权限问题。

具体来说,我认为问题在于我使用的是System.IO.Directory.GetCurrentDirectory()

有没有更好的选择?

【问题讨论】:

  • 请提供您的代码的精简示例。
  • 我认为需要更多信息。根据您的描述,问题可能是任何问题。
  • 我不知道,虽然问题可能更微妙,但我认为这正是 StingyJack 在下面回答的问题 - 运行 IIS 的帐户没有文件所在目录的写入权限,如果该文件要写入网络共享,IIS 帐户必须是域帐户。

标签: c# .net web-services file-io


【解决方案1】:

尝试授予 ASP.NET 用户(或任何运行 IIS 的帐户)写入您尝试写入的文件夹的权限。

如果这是网络共享,请尝试以可以写入共享的域用户身份运行 IIS。

记住授予最小权限的原则(不要使用管理员级别的访问权限)。

【讨论】:

  • 我已经多次看到这个问题,这几乎总是解决它的正确方法 - 检查 IIS 用户的权限,如果它是您正在写入的网络共享,它必须成为域用户。
【解决方案2】:

如果您没有指定目标文件夹,我假设您的 Web 服务想要写入“C:\Windows\System32\”或类似的东西。这就是为什么会在服务器上抛出 UnauthorizedAccessException 的原因。为了写入 Web 服务的“主”目录,您必须首先找出它的位置。

以下对我有用,但您也可以找到其他建议here

添加引用System.Web,调用获取当前目录:

strFileDestination = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + strFileName;

记得在 IIS 中授予您的服务写入权限。

【讨论】:

    【解决方案3】:

    如果您在 Windows 2003 上运行并且没有打开 ASP.NET 模拟,并且在 DefaultAppPool 或配置为在身份下运行的应用程序池中运行应用程序“网络服务”,然后您需要授予“网络服务”帐户对目标文件夹的写入权限。如果您在使用“网络服务”以外的身份的应用程序池中运行该站点,则该帐户可能需要对目标文件夹的写入权限。

    如果您运行的是 Windows 2000,那么'<MACHINENAME>\ASPNET' 帐户将需要对目标文件夹的写入权限。

    如果您启用了模拟,那么您需要向网站的匿名用户帐户授予对目标文件夹的写入权限。

    要检查是否启用了模拟,请打开(假设为 ASP.NET 2.0)然后检查您的 machine.config 文件 (C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG) 以查看您是否有以下设置:

    <identity impersonate="true"/>
    

    这也可能在您的应用程序的 web.config 中被覆盖。

    此外,如果您在部分信任环境中运行,那么您可能只能写入网站的应用程序文件夹,因为默认 FileIOPermission 通常设置为 $AppDir$,即您无法在其他任何地方修改文件,即使具有正确的 NTFS 权限。

    如果您正在写入网络共享,那么 StingyJack 会为您提供答案,但部分信任环境注意事项仍然适用。

    但首先检查您的 NTFS 权限,这可能是最好的选择。

    希望这会有所帮助 凯夫

    【讨论】:

      【解决方案4】:

      Stuart,您可能想要使用 Server.MapPath,而不是使用 System.IO.Directory.GetCurrentDirectory()。您可以为 Server.MapPath 提供相对于您要保存文件的 Web 服务位置的目录,否则您可能需要传递完整的文件路径“C:\Files\file.txt”。至于权限问题,我通常可以通过向 IIS_WPG 和 ASPNET 用户写入文件的文件夹添加写入权限来解决此问题(这些用户名在您的服务器上可能不同)。

      【讨论】:

        【解决方案5】:

        您应该能够从 Web 服务写入文件。这很可能是权限或信任问题。如果您处于有限信任(即中等信任)中,请确保您正在写入 Web 根目录中或下方的补丁。如果您已经这样做了,或者处于完全信任环境中,请检查以确保该目录具有 IIS 工作进程写入它的权限。

        【讨论】: