我想创建一个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。
答案 0 :(得分:2)
所以问题是当前的IIS用户没有访问该文件的权限(甚至没有读过)。
显然,Web服务将使用应用程序池标识而不是当前(Windows)用户(除非您为应用程序启用了Windows身份验证)。
按照以下步骤添加应用程序池的权限:
答案 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