【问题标题】:Creating a file on network location in asp.net在 asp.net 中的网络位置上创建文件
【发布时间】:2017-04-27 14:56:58
【问题描述】:

在我的 ASP.net 应用程序中,我正在创建一个文本文件并将数据写入该文件。我将该文件保存在服务器上的指定位置。这是一个内部网应用程序。当我使用 Visual studio.net 在本地运行我的应用程序时,我可以通过应用程序创建/写入文件并将其保存到该网络位置,但是当我在服务器上部署应用程序然后我尝试创建文件时。它说“拒绝访问”。

我不确定还有什么额外的东西,我需要这样做才能创建一个文本文件并将其保存到指定位置。

在这个应用程序中,我正在验证一组可以使用这个应用程序的用户。

我是否需要采取任何额外步骤在服务器位置创建文件,然后将数据保存到其中。以下是我的代码:

string DirectoryPath = getDirectortyPath();
StreamWriter file = new StreamWriter(DirectoryPath);
file.WriteLine(FullLine);

public string getDirectortyPath(string Year,string  Quarter)
{
    return ConfigurationManager.AppSettings["ReportPath"] + ".txt";
}

任何帮助将不胜感激。

【问题讨论】:

  • 您的服务器上运行 IIS 进程的用户是否安装了网络文件夹,并且对其具有写入权限?
  • 在以下Server.MapPath and Path.Combine 上进行谷歌搜索,您需要了解 Web 应用程序中的文件路径与 Windows 应用程序中的文件路径不同
  • 并且不要忘记将您的 StreamWriter 对象放在 using 语句中以避免锁定自己

标签: c# asp.net


【解决方案1】:

您只需要提供该网络的凭据即可。这意味着您需要提供要在其中存储文件的网络的用户名和密码。


在你的函数中添加:

#region network connection
        string networkPath = \\192.168.10.19\e;
        string userName = @"anil";
        string password = "1234";
        NetworkCredential credentials = new NetworkCredential(userName, password);
        string myNetworkPath = string.Empty;
     using (new ConnectToSharedFolder(networkPath, credentials))
            {
              //your stuff here
              // your new path must include: networkpath+ [your folder]
           }
  #endregion

使用上述凭据创建单独的控制器以在网络中建立连接

 public class ConnectToSharedFolder : IDisposable
    {
        readonly string _networkName;

        public ConnectToSharedFolder(string networkName, NetworkCredential credentials)
        {
            _networkName = networkName;

            var netResource = new NetResource
            {
                Scope = ResourceScope.GlobalNetwork,
                ResourceType = ResourceType.Disk,
                DisplayType = ResourceDisplaytype.Share,
                RemoteName = networkName
            };

            var userName = string.IsNullOrEmpty(credentials.Domain)
                ? credentials.UserName
                : string.Format(@"{0}\{1}", credentials.Domain, credentials.UserName);

            var result = WNetAddConnection2(
                netResource,
                credentials.Password,
                userName,
                0);

            if (result != 0)
            {
                throw new Win32Exception(result, "Error connecting to remote share");
            }
        }

        ~ConnectToSharedFolder()
        {
            Dispose(false);
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            WNetCancelConnection2(_networkName, 0, true);
        }

        [DllImport("mpr.dll")]
        private static extern int WNetAddConnection2(NetResource netResource,
            string password, string username, int flags);

        [DllImport("mpr.dll")]
        private static extern int WNetCancelConnection2(string name, int flags,
            bool force);

        [StructLayout(LayoutKind.Sequential)]
        public class NetResource
        {
            public ResourceScope Scope;
            public ResourceType ResourceType;
            public ResourceDisplaytype DisplayType;
            public int Usage;
            public string LocalName;
            public string RemoteName;
            public string Comment;
            public string Provider;
        }

        public enum ResourceScope : int
        {
            Connected = 1,
            GlobalNetwork,
            Remembered,
            Recent,
            Context
        };

        public enum ResourceType : int
        {
            Any = 0,
            Disk = 1,
            Print = 2,
            Reserved = 8,
        }

        public enum ResourceDisplaytype : int
        {
            Generic = 0x0,
            Domain = 0x01,
            Server = 0x02,
            Share = 0x03,
            File = 0x04,
            Group = 0x05,
            Network = 0x06,
            Root = 0x07,
            Shareadmin = 0x08,
            Directory = 0x09,
            Tree = 0x0a,
            Ndscontainer = 0x0b
        }
    }

【讨论】:

    【解决方案2】:

    通常在开发 IIS express 时在您的本地帐户下运行。这意味着它可以访问与您相同的网络驱动器。

    除非另有说明,否则部署的应用程序通常在 IIS_IUSRS 组下运行

    你有几个选择:

    • 允许此组访问您的网络驱动器

    • 以您自己的用户身份运行应用程序

    • 创建一个新用户并以此用户身份运行应用程序

    第一个选项并不理想。这意味着几乎所有在您的网络上使用标准配置运行的 Web 应用程序都可以访问该网络共享。

    第二个选项可能在短期内有用,但这意味着应用程序可以访问您帐户所做的一切。如果您的帐户是管理员帐户和/或您对服务器具有管理员访问权限,这可能非常危险。

    第三个选项总体上是最好的,但需要更多设置。

    要设置身份,您需要在 IIS 中创建一个新的应用程序池,然后使用高级设置将 Identity 选项设置为 Custom account 值,然后输入相应的域\用户名和密码。

    【讨论】:

      【解决方案3】:

      可能的原因可能是应用程序池的身份对正在创建/附加文件的网络位置没有写入权限。

      确保应用程序池的身份设置为对该网络位置具有读/写访问权限的帐户。

      希望这是有道理的。

      【讨论】:

        【解决方案4】:

        其他答案已经表明这可能是由于 IIS 帐户没有适当的权限。我很确定他们是对的。

        根据经验,还有其他选择;尽管这些可能不适用于您的具体情况。

        • 如果这是一个业务环境,Web 服务器可能与员工计算机位于不同的域中;并且根本无法访问文件服务器无论访问权限如何
        • Web 服务器可能依赖于不同的 DNS 条目,并且可能不知道与您使用相同名称的服务器。*

        *这是个人轶事。我已经设置了一些代码来将文件写入\\fileserverName\directory\file.txt;但这在发布应用程序后不起作用。
        事实证明,当我使用\\fileserverName.domain.local\directory\file.txt 时,它确实有效。 Web 服务器根本不知道服务器的简称;因为它只是添加到我们的办公室域,而不是网络服务器域。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多