2010-11-04 60 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