2016-10-28 7 views
0

私のIISサーバーで私は仮想ディレクトリ( "docPath")私のマシンの物理的なフォルダにマップされています。ウィンドウサービス内の仮想ディレクトリの物理パスを取得

私はウィンドウサービスを持っており、このサービスから、私は(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

'System.Web.Hosting.HostingEnvironment.MapPath'を試してみてください。 – JanneP

+0

@ JanneP私はすでにこれを試してきましたが、これも動作していません。 –

答えて

0

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(); 
      } 

あなたがサービスは、単に `MapPathの()`の戻り値を出力し、IIS上のURLにHTTPリクエストを送信する可能性があり、Windowsサービス

using System.IO; 
using System.Net; 
using System.Text; 
+0

javascriptのコードを投稿しておらず、実際にはブラウザから直接実行できるコードスニペットを使用しないでください。 –

+0

Windowsサービスが.NETで記述されていない場合は、HttpWebRequestを使用できないため、別の方法を使用してHTTPリクエストを送信してください。 WinInet APIやサードパーティのソケット通信ライブラリ、さらにはWinSockを直接使用するなど、これは非常に単純なHTTP要求で手動で書式を設定するためです。 –

関連する問題