File.Open在具有Admin Credentials的Windows 2008R2 IIS下无法运行。在VS2010 Cassini下工作

时间:2011-01-26 17:53:59

标签: c# wcf file-io iis-7.5 cassini

以下代码在Cassini下运行正常,但在IIS下根本没有。我得到file not found,当我测试C:\ test.pdf(测试IIS权限)时,我无法获取远程共享上的文件或本地文件

此应用程序的目的是创建一个HTTP代理,允许通过安全URL检索文件。此示例中省略了安全代码。我只关注这个普通样本中的文件访问。

我确定了

  1. 应用程序池(进程模型标识)正在运行域管理员帐户
  2. 网站物理路径凭据在同一管理员帐户下运行
  3. 管理员帐户在本地政策中拥有BatchRun as a Service权限。
  4. 我使用以下网址访问WCF服务

    http://localhost:1651/services/GetFile.svc/get?swt=\\remoteserver\share\file.pdf

    [ServiceContract(SessionMode = SessionMode.NotAllowed)]
    public interface IGetFile
    {
        [OperationContract]
        [WebGet(UriTemplate = "/get?swt={filename}", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
        Stream Get(string filename); 
    }
    
    
     [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class GetFile : IGetFile
    {
        bool debug = true;
    
        public Stream Get(string filename )
        {
            //this will cause the file dialog to show the file name instead of "get" 
            WebOperationContext.Current.OutgoingResponse.Headers.Add( "Content-disposition", string.Format("inline; filename={0}", filename));
            WebOperationContext.Current.OutgoingResponse.ContentType = "application/octect-stream";
    
            FileStream fs1= null;
    
            //WindowsIdentity winId = new WindowsIdentity("aamankow@nfp.com");
            //using (winId.Impersonate())
            {
                try
                {
                    fs1 = File.OpenRead(filename);
                }
                catch (FileNotFoundException e)
                {
                    if (debug)
                    throw;
                    else
                    return null;
                }
                catch (IOException e)
                {
                    if (debug)
                    throw;
                    else
                    // message: Either a required impersonation level was not provided, or the provided impersonation level is invalid.
                    return null;
                }
            }
    
            return fs1;
    

2 个答案:

答案 0 :(得分:0)

在您的测试系统和cassini下,您将作为自己的用户帐户运行,该帐户具有C:\驱动器根目录的权限。在IIS下,您在一个特殊帐户下运行,该帐户没有C:\驱动器根目录的权限。在这个位置放置网站所需的文件是不好的做法。

答案 1 :(得分:0)

上面的代码在版本3.5上不起作用...只是4.0

将应用程序池更改为4.0修复了该问题,并允许我从任何UNC中读取