1

我想创建一个将文本文件作为参数并返回该文件内容的 Web 服务。

然后,此 Web 服务将由 C# 客户端使用。

这就是我到目前为止所拥有的(网络服务):

[WebMethod]    
public String txtFile(String filename)
{
   StreamReader sr = File.OpenText(filename);   
   {
      String line = sr.ReadToEnd();
      return line;            
   } 
}

和(客户):

WebService ws = new WebService();
ws.txtFile("textfile.txt");

当我运行客户端时,我得到 UnauthorizedAccessException。

4

5 回答 5

2

所以问题是当前的 IIS 用户没有访问文件的权限(甚至没有读取)。

显然,Web 服务将使用应用程序池标识,而不是当前(Windows)用户(除非您为您的应用程序打开了 Windows 身份验证)。

按照以下步骤为应用程序池添加权限:

  1. 打开 Windows 资源管理器
  2. 选择文件或目录
  3. 右键单击文件并选择“属性”
  4. 选择“安全”选项卡
  5. 单击“编辑”,然后单击“添加”按钮
  6. 单击“位置”按钮并确保选择您的机器
  7. 在“输入要选择的对象名称:”文本框中输入“IIS AppPool\DefaultAppPool”
  8. 单击“检查名称”按钮,然后单击“确定”
于 2013-04-23T17:39:26.297 回答
2

您只发送文件名,那么服务如何通过文件名从服务器检查您的本地文件!

您需要提供文件名的完整路径,例如网络路径或文件服务器路径。并且该路径应该可供运行 Web 服务的用户访问。

但是,如果您更改如下方法并使用文件名发送文件内容,您可以将其保存到服务器。

[WebMethod]
public void Upload(byte[] contents, string filename)
{
    var appData = Server.MapPath("~/App_Data");
    var file = Path.Combine(appData, Path.GetFileName(filename));
    File.WriteAllBytes(file, contents);
}
于 2013-04-23T17:08:51.947 回答
1

在您的 Web 服务中添加一些日志,并将输入参数和异常详细信息转储到日志框架(是的,您应该在 Web 服务中添加一个 try-catch)。

在你这样做之前:

StreamReader sr = File.OpenText(filename);

还要检查:

if(!File.Exists(filename))
{
  // dump to the log file the file was not found at the location... filename
  return string.empty;
}

那么你可以这样做:

using(var sr = File.OpenText(filename))
{
  string line = sr.ReadToEnd();
  return line;
}

最后,请注意将相对路径从客户端传递到服务器并不意味着什么,您可能应该验证只能指定网络路径、C 或 D 驱动器或调用中的任何其他本地映射驱动器/路径客户端可能无法访问或访问您的 Web 服务器上的其他内容。

于 2013-04-23T17:07:39.067 回答
1

如果您在 IIS 中运行 Web 服务,则 Web 服务不会神奇地以您的用户身份运行。除非您为您的应用程序打开了 Windows 身份验证,否则 Web 服务将使用应用程序池身份访问文件,并且该身份必须对文件具有权限。

于 2013-04-23T17:44:09.490 回答
0

File.OpenText可以抛出许多不同的异常: http: //msdn.microsoft.com/en-us/library/system.io.file.opentext.aspx (我首先要确保路径格式正确)

StreamReader.ReadToEnd可以抛出OutOfMemoryExceptionIOException。请参阅此处的参考:http: //msdn.microsoft.com/en-us/library/system.io.streamreader.readtoend.aspx

于 2013-04-23T17:07:09.297 回答