【问题标题】:Write a simple text file to IBM iSeries IFS from my ASP.NET web app从我的 ASP.NET Web 应用程序向 IBM iSeries IFS 写入一个简单的文本文件
【发布时间】:2017-04-26 18:34:36
【问题描述】:

所以我的部分工作是将文件写入 iSeries IFS,或者这个路径,特别是 \ServerIPAddress\home\test\ 我有一个 ASP.NET Web 应用程序来执行此操作,这是我用来将简单文本文件写入该目录的代码 (C#):

        string filename = @"\\SomeIPAdress\home\test\test.txt";
        byte[] file = Encoding.ASCII.GetBytes("hello world");
        FileStream fs = new FileStream(filename, FileMode.OpenOrCreate);
        fs.Write(file, 0, file.Length);
        fs.Close();

执行此代码时,程序给我“拒绝访问”错误

异常详细信息:System.UnauthorizedAccessException:对路径“\SomeIPAddress\home\test\test.txt”的访问被拒绝。

ASP.NET 无权访问请求的资源。考虑将资源的访问权限授予 ASP.NET 请求标识...

我可以使用 Windows 文件资源管理器使用 IBM UID 和密码访问此目录 \SomeIPAddress\home\test,我也可以手动创建和编辑文本文件。

我知道这与通过提供该 UID 和密码来授予对我的 ASP.NET 应用程序的访问权限有关,但我不太明白,而且我已经被困了好几天了。

如果您需要任何额外信息,请告诉我。感谢您的帮助

【问题讨论】:

  • 运行您站点的应用程序池的用户是什么?检查该用户的访问权限。
  • 我相信它是 IIS APPPOOL\DefaultAppPool。如何检查该用户的访问权限?
  • 您可能应该为有权访问该资源的应用程序池创建一个专用服务帐户。创建后,您可以使用服务帐户登录以验证权限是否有效,或者直接使用RunAs

标签: c# asp.net ibm-midrange iseries-navigator


【解决方案1】:

两种解决方案。 最佳实践。将系列设置为使用与网络上其他所有设备相同的域控制器。然后它将知道请求访问的 asp.net 帐户并允许访问 IFS。

在托管指向 IFS 的 asp.net 页面的计算机上设置映射驱动器。映射的驱动器将在保管库中保存凭据。

【讨论】:

  • 我过去在使用这两个选项时都遇到过问题。
【解决方案2】:

感谢 Mike Wills 引导我找到解决方案。这是我使用 P/Invoke WNet Connection 连接到网络共享的代码,来自这个答案here

DisconnectFromShare(@"\\server-a\DBFiles", true); //Disconnect in case we are currently connected with our credentials;

ConnectToShare(@"\\server-a\DBFiles", username, password); //Connect with the new credentials

if (!Directory.Exists(@"\\server-a\DBFiles\"))
    Directory.CreateDirectory(@"\\server-a\DBFiles\"+Test);   
File.Copy("C:\Temp\abc.txt", @"\\server-a\DBFiles\");

DisconnectFromShare(@"\\server-a\DBFiles", false); //Disconnect from the server.

感谢大家的帮助。

【讨论】:

  • 有趣的是,我遇到了一个问题,发现这是一个可能的解决方案。我们会看看这是否有效。
【解决方案3】:

我认为this 是您正在寻找的。抱歉,我无法在工作中访问我知道现在可以使用的代码。做起来真的很简单,而且效果很好。

如果你想要我的工作代码,请告诉我,我会在明天提供。

更新:抱歉,我之前没有发布我的代码,我们忙于工作。

NetworkCredential nc = new NetworkCredential("user", "password", "domain");

using (new NetworkConnection(@"\\server\directory1\directory2", nc))
{
    // your IO logic here
}

【讨论】:

  • 谢谢!我正在从您的链接中尝试一些解决方案,但如果您也可以发布您的代码,那就太好了。再次感谢。
  • 用我要提供的代码示例更新了答案。抱歉,它正在从一件事跳到另一件事,没有时间呼吸或在 SO 上闲逛。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 2011-11-17
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多