如何使用Web服务读取文本文件

时间:2013-04-23 16:56:16

标签: c# .net web-services

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

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

这是我到目前为止(webservice):

[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。

5 个答案:

答案 0 :(得分:2)

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

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

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

  1. 打开Windows资源管理器
  2. 选择文件或目录
  3. 右键单击该文件,然后选择“属性”
  4. 选择“安全”标签
  5. 点击“修改”,然后点击“添加”按钮
  6. 点击“位置”按钮,确保选择您的机器
  7. 在“输入要选择的对象名称:”文本框中输入“IIS AppPool \ DefaultAppPool”
  8. 点击“检查姓名”按钮,然后点击“确定”

答案 1 :(得分: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服务器上的不同内容。

答案 2 :(得分:1)

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

您需要提供文件名的完整路径,例如网络路径或文件服务器路径。并且该路径应该可供运行用户的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);
}

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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