如何解决Web Services出现System.UnauthorizedAccessExcepti

如何解决Web Services出现System.UnauthorizedAccessException异常

刑天 发表于 2006-10-28 00:17:57

当处理有关文件流的web服务的时候,调试时出现异常:
System.UnauthorizedAccessException: Access to the path 'some file path' is denied.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
没有文件的访问权限。解决办法有二:
1.在web.config文件的system.web>节点里添加一行:
这个userName和password就是asp.net做访问的身份,在IIS里可以看到。
2.在web.config文件的system.web>节点里添加一行:
然后对你要操作的文件目录增加用户,也就是ASP.net的用户,一般都是“IUSER_computerName”,不清楚的话,可以从IIS里copy出来。
第一个的优点在于一劳永逸,以后文件目录变了也没事;后者的长处在于直接增加用户就可以了,尤其在密码不清楚的情况下。
 
一个文件流操作的web服务的例子:
using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
 
 
///
/// Summary description for WebService
///
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
 
    public WebService()
    {
 
        //Uncomment the following line if using designed components
        //InitializeComponent();
    }
 
    [WebMethod]
    public string HelloWorld()
    {
        return "Hello World";
    }
    public struct WebFile
     {
         public string Name;
         public byte[] Contents;
         public DateTime    CreationTime;
         public DateTime    LastAccessTime;
         public DateTime    LastWriteTime;
     }
 
     ///
     /// Summary description for Service1.
     ///
     public class WebDirectory : System.Web.Services.WebService
     {
         public WebDirectory()
         {
              //CODEGEN: This call is required by the ASP.NET Web Services Designer
              InitializeComponent();
         }
 
         #region Component Designer generated code
        
         //Required by the Web Services Designer
         private IContainer components = null;
                  
         ///
         /// Required method for Designer support - do not modify
         /// the contents of this method with the code editor.
         ///
         private void InitializeComponent()
         {
         }
 
         ///
         /// Clean up any resources being used.
         ///
         protected override void Dispose( bool disposing )
         {
              if(disposing && components != null)
              {
                   components.Dispose();
              }
              base.Dispose(disposing);        
         }
        
         #endregion
 
         // WEB SERVICE EXAMPLE
         // The HelloWorld() example service returns the string Hello World
         // To build, uncomment the following lines then save and build the project
         // To test this web service, press F5
 
//       [WebMethod]
//       public string HelloWorld()
//       {
//            return "Hello World";
//       }
 
         [WebMethod]
         public string[] ListFiles()
         {
              return Directory.GetFiles("c:\Public");
         }
    
         [WebMethod]
         public WebFile GetFile(string fileName)
         {
              WebFile webFile = new WebFile();
              string   filePath = "c:\Public\" + fileName;
 
              // Set the name of the file.
              webFile.Name = fileName;
           
              // Obtain the contents of the requested file.
              Stream        s = File.Open(filePath, FileMode.Open);
              webFile.Contents = new byte[s.Length];
              s.Read(webFile.Contents, 0, (int)s.Length);
 
              // Retrieve the date/time stamps for the file.
              webFile.CreationTime = File.GetCreationTime(filePath);
              webFile.LastAccessTime = File.GetLastAccessTime(filePath);
              webFile.LastWriteTime = File.GetLastWriteTime(filePath);
 
              return webFile;
         }
     }
}
 
客户端,控制台应用程序
using System;
using System.IO;
using WebFileUtil.localhost;
 
namespace WebFileUtil
{
    public class WebFileUtil
    {
        static int Main(string[] args)
        {
            // Validate number of command line arguments.
            if (!((args.Length == 1 && args[0].ToUpper() == "DIR") ||
                (args.Length >= 2 && args.Length
            {
                DisplayUsage();
                return 64;
            }
 
            // Initialize source and destination variables.
            string source = null;
            string destination = null;
            if (args.Length > 1)
            {
                source = args[1];
                destination = source;
 
                if (args.Length == 3)
                {
                    destination = args[2];
                }
            }
 
            // Process command.
            switch (args[0].ToUpper())
            {
                case "DIR":
                    ListFiles();
                    break;
                case "GET":
                    GetFile(source, destination);
                    break;
                default:
                    DisplayUsage();
                    break;
            }
 
            return 0;
        }
 
        private static void ListFiles()
        {
            WebDirectory webDir = new WebDirectory();
            string[] files;
 
            files = webDir.ListFiles();
            foreach (string file in files)
            {
                Console.WriteLine(file);
            }
 
            Console.WriteLine("\n{0} file(s) in directory.", files.Length);
        }
 
        private static void GetFile(string source, string destination)
        {
            WebDirectory webDir = new WebDirectory();
            WebFile webFile = new WebFile();
 
            // Retrieve the requested file and then save it to disk.
            webFile = webDir.GetFile(source);
 
            // Save the retrieved web file to the file system.
            FileStream fs = File.OpenWrite(destination);
            fs.Write(webFile.Contents, 0, webFile.Contents.Length);
            fs.Close();
 
            // Set the date/time stamps for the file.
            File.SetCreationTime(destination, webFile.CreationTime);
            File.SetLastAccessTime(destination, webFile.LastAccessTime);
            File.SetLastWriteTime(destination, webFile.LastWriteTime);
        }
 
        private static void DisplayUsage()
        {
            Console.WriteLine("WebFile is used to send and retrieve files from the WebDirectory web service.");
            Console.WriteLine("\nUsage: WebFile command source [destination]");
            Console.WriteLine("\tcommand     - Either DIR or GET.");
            Console.WriteLine("\tsource      - The the name of the file to either retrieve or send.");
            Console.WriteLine("\tdestination - Optionally the name of the destination file.");
            Console.WriteLine("\nExamples:");
            Console.WriteLine("\tWebFile GET somefile.exe");
            Console.WriteLine("\tWebFile GET somefile.exe c:\temp");
            Console.WriteLine("\tWebFile GET somefile.exe c:\temp\myfile.exe");
        }
    }
}
VS2005测试通过。
[reference]“Building XML Web Services –For The Microsoft.NET Platform”(Scott Short)--构建XML Web服务——基于Microsoft .NET平台
上一篇:jmeter 随机函数 使用


下一篇:apache的rewrite规则无法加载问题