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

本文关键字:取文本 文件 读取 服务 何使用 web | 更新日期: 2023-09-27 18:10:26

我想创建一个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.

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

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

您需要为文件名提供完整路径,如网络路径或文件服务器路径。该路径对于运行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);
}

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

显然,web服务将使用应用程序池身份,而不是当前(windows)用户(除非你已经为你的应用程序打开了windows身份验证)。

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

  1. 打开资源管理器
  2. 选择文件或目录
  3. 右键单击文件,选择"属性"
  4. 选择"安全"选项卡
  5. 点击"编辑",再点击"添加"按钮
  6. 点击"位置"按钮,确保你选择了你的机器
  7. 在"输入要选择的对象名称:"文本框中输入"IIS appppool 'DefaultAppPool"
  8. 点击"核对姓名"按钮,点击"确定"

在您的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服务器上不同的东西。

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

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