在ASP.NET中创建网络位置文件

mfpqipee  于 12个月前  发布在  .NET
关注(0)|答案(4)|浏览(117)

在我的ASP.NET应用程序中,我创建了一个文本文件,并将数据写入该文件。我将该文件保存在服务器上的指定位置。这是一个内部网应用程序。
当我使用Visual Studio在本地运行我的应用程序时,我可以通过应用程序创建/写入文件并将其保存到该网络位置,但当我在服务器上部署应用程序时,然后我试图创建文件。
上面写着“拒绝访问”
我不知道有什么额外的事情,我需要做,这样我就可以创建一个文本文件,并保存到指定的位置。
在这个应用程序中,我正在验证一组可以使用这个应用程序的用户。
我是否需要采取任何额外的步骤来创建服务器位置上的文件,然后保存数据到它?
下面是我的代码:

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

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

字符串

qncylg1j

qncylg1j1#

  • 您只需要提供该网络的凭据。这意味着您需要提供您要在其上存储文件的网络的用户名和密码。*
    在函数中添加:
#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
        }
    }

hfwmuf9z

hfwmuf9z2#

通常在开发时,IIS express会在您的本地帐户下运行。这意味着它可以访问与您相同的网络驱动器。
除非另有说明,否则部署的应用程序通常在IIS_IUSRS组下运行
你有几个选择:

  • 允许此组访问您的网络驱动器
  • 以自己的用户身份运行应用程序
  • 创建一个新用户并以此用户身份运行应用程序

第一个选项并不理想,这意味着几乎所有使用标准配置在网络上运行的Web应用程序都可以访问该网络共享。
第二个选项可能在短期内有用,但这意味着应用程序可以访问您的帐户所做的一切。如果您的帐户是管理员帐户和/或您对服务器具有管理员访问权限,这可能非常危险。
第三种选择总体上是最好的,但需要更多的设置。
要设置标识,您需要在IIS中创建一个新的应用程序池,然后使用高级设置将Identity选项设置为Custom account值,然后输入相应的域\用户名和密码。

7kjnsjlb

7kjnsjlb3#

其他的答案已经说明了这可能是由于IIS帐户没有适当的权限。我很确定他们是对的。
根据经验,还有其他选择;尽管这些可能不适用于您的特定情况。

  • 如果这是一个业务环境,Web服务器可能与员工计算机位于不同的域中;无论访问权限如何,都无法访问文件服务器 *。
  • Web服务器可能依赖于不同的DNS条目,并且可能不知道与您同名的服务器。
  • 这是我的个人轶事。我设置了一些代码来编写一个文件到\\fileserverName\directory\file.txt;但是在发布应用程序后,这并不起作用。

事实证明,当我使用\\fileserverName.domain.local\directory\file.txt时,它确实工作了。Web服务器根本不知道服务器的简称;因为它只添加到我们的办公室域,而不是Web服务器域。

4dc9hkyq

4dc9hkyq4#

可能的原因是应用程序池的标识对创建/追加文件的网络位置没有写访问权限。
确保应用程序池的标识设置为对该网络位置具有读/写访问权限的帐户。

相关问题