我想在SQL Server CLR中使用Microsoft.Web.Administration.dll,以便在运行时获取特定Web应用程序的物理路径,但DLL在SQL Server中不可用或测试,并且添加它需要添加一系列依赖的DLL(也是未经测试的),所以基本上都是NEVERMIND以上所有。
关于这个问题,但首先是一个简短的背景。我的数据库应用程序的体系结构非常奇特...“Database.Values”命名空间(在database.dll中)包含许多C#类,每个类都代表“RegexConstrainedString”或“ConstrainedNumber”(两个自定义类)数据库中各个字段的正则表达式和数值约束。每个类都标有指定各种表+字段名组合的属性,指示每个规则在数据库中应用的表和字段名称。
部署应用程序接受该database.dll,使用反射来查找具有上述属性的类,并为每个类动态生成(在IL操作码中)一个函数(带有“Check”的类名),其目的仅仅是尝试使用关联的类实例化给定的字符串或数字,并根据实例化是否成功返回true或false。当字符串或数字与类定义的约束不匹配时,实例化失败。然后,部署应用程序使用ILMerge.exe将其动态生成的函数与原始database.dll合并,以生成部署到SQL Server的新database.dll。然后打开一个GUI,允许一键创建,启用和检查所有相关的SQL检查约束函数,这些函数调用生成的基于CLR类的“* Check”函数。
无论如何......其中一个特别称为“Text”的类通过将Unicode字符串映射到ASCII字符串来对字段强制执行ASCII编码,并且为了完整性,它将映射所有65536个可能的双字节(16位)UCS2使用由Web应用程序创建和编辑的字符映射将代码点值转换为特定的ASCII字符。当然,我可以将范围之外的所有内容(32-126)映射到问号字符,但是我想要更好地控制我将每个可能的Unicode字符映射到它非常类似的ASCII字符的点,所以它可能是现存最完整(虽然主观)的视觉地图之一。
问题是,驻留在SQL CLR中的database.dll中的Text类的静态构造函数需要加载该ASCII映射文件,该文件驻留在特定Web应用程序的根目录中。如果没有硬编码并且无法使用Microsoft.Web.Administration.dll对(new ServerManager()).Sites["Default Web Site"].Applications["/utilities"].VirtualDirectories["/"].PhysicalPath
的调用,我该如何才能获得该路径?
答案 0 :(得分:0)
我最初的想法是你打电话给WMI找出IIS信息:
这个问题/答案How to get IIS application info via WMI说明了如何做到这一点。
然后,您可以使用this technique和http://msdn.microsoft.com/en-us/magazine/cc302051.aspx将其与SQL Server CLR集成。
我没有您的特定用例的任何具体示例,但上述链接应该给您足够的开始。
答案 1 :(得分:0)
通过简单地绕过ServerManager
类并只读取它正在读取的相同配置文件,这个信息应该很容易获得。我检查的系统运行IIS 7.0,配置文件位于以下位置:
<强> C:\ Windows \ System32下\ INETSRV \设置\的applicationHost.config 强>
只需加载该XML,然后沿着以下行使用XQuery表达式来获取该物理路径:
(/configuration/system.applicationHost/sites/site[@name="Default Web Site"]/application[@path="/utilities"]/virtualDirectory[@path="/"]/@physicalPath)[1]
关于问题中的以下陈述(不是关于具体要求,而是与请求的背景有关):
其中一个特别称为&#34; Text&#34;通过将Unicode字符串映射到ASCII字符串对字段强制执行ASCII编码,并且为了完整性,它将映射所有65536个可能的双字节(16位)UCS2代码点值
实际上,没有65,536个可能的UCS-2字符。 UCS-2中最多有63,477个字符。当使用2个字节时,该数字来自65,536个可能的值,然后删除:
但是,NCHAR
,NVARCHAR
,XML
和NTEXT
(但不要再使用这个!)数据类型实际上可以保存完整的UTF -16编码。只是当使用名称不以_SC
结尾的排序规则时,内置函数无法正确解释非UCS-2字符(这些是在SQL Server 2012中引入的)。因此,XML和N
- 前缀类型中真正的全部字符实际上是1,112,064个代码点(有关详细信息,请参阅维基百科上的UTF-16)。