在我的IIS服务器中,我有一个虚拟目录 (“docPath”),它与我的机器的物理文件夹映射。
我有 Window Service ,我需要从此服务获取虚拟目录的物理路径(在IIS上创建),即“docPath”。
由于这是Windows服务,因此我没有 HTTPContext 对象,我无法使用HttpContext.Current.Server.MapPath("/docPath");
这是我到目前为止所尝试的内容:
我尝试使用ServerManager中的Microsoft.Web.Administration。
ServerManager serverManager = new ServerManager();
Site site = serverManager.Sites.FirstOrDefault(s => s.Name == "Default Web Site");
Application myApp = site.Applications["/docPath"];
但是在Sites中,只有在IIS服务器上创建的Web应用程序才会到来,而不是虚拟目录。
此外,System.Web.Hosting.HostingEnvironment.MapPath
也无效。
有人可以告诉我如何在Windows服务中获取虚拟目录的物理路径?
答案 0 :(得分:0)
为您的网络应用添加通用处理程序,然后让它返回物理路径。在通用处理程序中,您可以使用此代码。
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;