获取Window Service中虚拟目录的物理路径

本文关键字:路径 Window Service 虚拟 获取 | 更新日期: 2023-09-27 18:15:24

在我的IIS服务器上,我有一个虚拟目录("docPath"),它与我的机器的物理文件夹映射。

我有一个窗口服务,从这个服务我需要得到虚拟目录的物理路径(在IIS上创建),即"docPath"

由于这是Windows服务,所以我没有HTTPContext对象,我不能使用HttpContext.Current.Server.MapPath("/docPath");

这是我到目前为止所尝试的:

我尝试使用来自Microsoft.Web.Administration的服务器管理器。

ServerManager serverManager = new ServerManager();
Site site = serverManager.Sites.FirstOrDefault(s => s.Name == "Default Web Site");
Application myApp = site.Applications["/docPath"];

但是在站点中,只有在IIS服务器上创建的web应用程序才会来,而不是虚拟目录。

同样,System.Web.Hosting.HostingEnvironment.MapPath也不工作。

谁能告诉我如何在Windows服务中获得虚拟目录的物理路径?

获取Window Service中虚拟目录的物理路径

添加一个通用处理程序到你的web应用程序,然后让它返回给你的物理路径。在泛型处理程序中,您可以使用以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace WebApplication2
{
    /// <summary>
    /// Summary description for PhysicalPathHandler
    /// </summary>
    public class PhysicalPathHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            context.Response.Write(HttpContext.Current.Server.MapPath("docPath"));
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

那么你可以像这样在windows服务中使用它。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("your-web-app-web-address-to-the-generic-handler"); //e.g. http://localhost:2950/PhysicalPathHandler.ashx
            string physicalPath = string.Empty; //this will store the physical path
            using (var response = (HttpWebResponse)request.GetResponse())
            {
                var encoding = Encoding.GetEncoding(response.CharacterSet);
                using (var responseStream = response.GetResponseStream())
                using (var reader = new StreamReader(responseStream, encoding))
                    physicalPath= reader.ReadToEnd();
            }

请记住在windows服务

中包含以下命名空间
using System.IO;
using System.Net;
using System.Text;