在我的ASP.net应用程序中,我正在创建一个Text文件并将数据写入该文件。我将该文件保存在服务器上的指定位置。这是一个Intranet应用程序。当我使用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";
}
任何帮助都会得到很大的帮助。
答案 0 :(得分:0)
可能的原因可能是应用程序池的标识没有对创建/附加文件的网络位置的写访问权。
确保将应用程序池的标识设置为对该netowrk位置具有读/写访问权限的帐户。
希望这是有道理的。
答案 1 :(得分:0)
通常在您的本地帐户下开发IIS Express时。这意味着它可以访问您所使用的相同网络驱动器。
部署的应用程序通常在IIS_IUSRS组下运行,除非另有说明
您有几个选择:
允许此群组访问您的网络驱动器
以您自己的用户身份运行该应用程序
创建新用户并以此用户身份运行应用程序
第一种选择并不理想。这意味着几乎所有使用网络上标准配置运行的Web应用程序都可以访问该网络共享。
第二个选项在短期内可能有用,但这意味着应用程序可以访问您帐户的所有内容。如果您的帐户是管理员帐户和/或您拥有对服务器的管理员权限,则可能非常危险。
第三种选择总体上是最好的,但需要更多设置。
要设置标识,您需要在IIS中创建一个新的应用程序池,然后使用高级设置将Identity
选项设置为Custom account
值,然后输入相应的域\用户名和密码。
答案 2 :(得分:0)
其他答案已经说过,这可能是由于IIS帐户没有适当的权限。我很确定他们是对的。
根据经验,还有其他选择;虽然这些可能不适用于您的具体情况。
*这是个人轶事。我已经设置了一些代码来将文件写入\\fileserverName\directory\file.txt
;但是在发布申请后这没有用
事实证明,当我使用\\fileserverName.domain.local\directory\file.txt
时,它确实有效。 Web服务器根本不知道服务器的短名称;因为它只被添加到我们的办公室域,而不是web服务器域。
答案 3 :(得分:-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
}
}