如何使用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服务的用户应该是可访问的。
,但如果您更改方法如下,并发送文件内容与文件名,您可以将其保存到服务器。
[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身份验证)。
按照以下步骤为应用程序池添加权限:
- 打开资源管理器
- 选择文件或目录
- 右键单击文件,选择"属性"
- 选择"安全"选项卡
- 点击"编辑",再点击"添加"按钮
- 点击"位置"按钮,确保你选择了你的机器
- 在"输入要选择的对象名称:"文本框中输入"IIS appppool 'DefaultAppPool"
- 点击"核对姓名"按钮,点击"确定"
在您的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
可以抛出OutOfMemoryException或IOException。参考:http://msdn.microsoft.com/en-us/library/system.io.streamreader.readtoend.aspx