2010-11-04 64 views
2

編程設置HTTP處理程序,我需要動態實例從控制檯應用程序的Web應用程序。通過這個定義,我的意思是我的控制檯應用程序包含一個未綁定到IIS/XSP的Web應用程序。在ASP.NET應用程序

Currently,我創建了一個web應用程序到一個臨時目錄,並將一些僞造的文件複製到它。這是一種特殊的Global.asax映射到我自己的實現的HttpApplication的Web應用程序中使用(我需要做的在應用程序啓動一些初始化),然後我僞造映射到我自己的框架類特殊的.asmx文件動態插件

  foreach (IPlugin plugin in _target.Plugins) 
      { 
       WsdlSkeletonDefinition[] defs = plugin.GetWsdlSkeletons(); 
       if (defs != null) 
        foreach (WsdlSkeletonDefinition def in defs) 
        { 
         if (def.SkeletonType == null) 
          throw new LogbusException(string.Format("Plugin {0} declares empty skeleton type", 
                    plugin.Name)); 
         if (def.SkeletonType.IsAssignableFrom(typeof(System.Web.Services.WebService))) 
          throw new LogbusException(
           string.Format("Plugin {0} does not declare a valid WSDL skeleton type", plugin.Name)); 

         string fname = def.UrlFileName; 
         if (fname.EndsWith(".asmx", false, CultureInfo.InvariantCulture)) 
          fname = fname.Substring(0, fname.Length - 5); 

         if (!Regex.IsMatch(fname, @"^[a-zA-Z0-9_\.\-%]+$", RegexOptions.CultureInvariant)) 
          throw new LogbusException(string.Format(
           "Plugin {0} declares invalid WSDL endpoint: {1}", 
           plugin.Name, def.UrlFileName)); 

         string wsDeclaration = string.Format(ASMX_TEMPLATE, def.SkeletonType.AssemblyQualifiedName); 

         using (
          StreamWriter sw = new StreamWriter(File.Create(Path.Combine(_physicalPath, fname + ".asmx")), 
                   Encoding.Default)) 
          sw.Write(wsDeclaration); 

         //Copy skeleton asembly if needed 
         CopyAssemblyTo(def.SkeletonType.Assembly, bindir); 
         foreach (AssemblyName dependency in def.SkeletonType.Assembly.GetReferencedAssemblies()) 
         { 
          try 
          { 
           CopyAssemblyTo(Assembly.Load(dependency), bindir); 
          } 
          //Possible broken dependency 
          catch { } 
         } 
        } 
      } 

我的方法工作,但我不這麼滿意,因爲我必須寫大量的垃圾轉換成文件系統,即使我最終刪除了這一切。

我知道我可以通過Web.config控制HTTP處理程序,但我不想爲此僞造一個Web.config。我想創建一個映射,例如我可以從Web服務的URL中刪除.asmx擴展名,並仍然可以獲取它們。

例如,一個默認腳本是「LogbusManagement.asmx」,其必須被硬編碼到客戶端API和的.asmx防止移植到其它平臺,如PHP。我想使「LogbusManagement.asmx」等同於「LogbusManagement」和任何擴展名。爲此,我可以使用HttpHandlerFactory。

我直接的問題是,

喜歡問通過別人here:有沒有辦法以編程方式,可能是從Global.asax中,要爲Web應用程序IHttpHandlers或IHttpHandlerFactories?

謝謝

回答

1

這個問題在計算器已經回答:

Any way to add HttpHandler programatically in .NET?

+0

謝謝。我試圖搜索,但沒有找到它......無論如何它不適用於我的情況,因爲我在IIS之外,但我知道該怎麼辦:) – 2010-11-05 09:28:42