0

我想在 SQL Server CLR 中使用 Microsoft.Web.Administration.dll 以在运行时获取特定 Web 应用程序的物理路径,但 DLL 在 SQL Server 中不可用或测试,添加它需要添加一系列依赖 DLL(也未经测试),所以基本上不要介意以上所有内容。

关于这个问题,但首先是简短的背景。我的数据库应用程序的架构非常漂亮......“Database.Values”命名空间(在 database.dll 中)包含许多 C# 类,每个类都代表“RegexConstrainedString”或“ConstrainedNumber”(两个自定义类)的子类数据库中各个字段的正则表达式和数值约束。每个类都标有指定各种表+字段名组合的属性,这些组合指示每个规则在数据库中适用于哪些表和字段名。

部署应用程序获取该 database.dll,使用反射来查找具有上述属性的类,并为每个类动态生成(在 IL 操作代码中)一个函数(类名附加“检查”),其目的只是尝试实例化一个给定带有关联类的字符串或数字,并根据实例化是否成功返回真或假。当字符串或数字与类定义的约束不匹配时,实例化失败。然后,部署应用程序使用 ILMerge.exe 将其动态生成的函数与原始 database.dll 合并,以生成一个新的 database.dll,并将其部署到 SQL Server。然后它会打开一个 GUI,允许一键创建、启用和检查所有相关的 SQL 检查约束函数,

无论如何...其中一个特别称为“文本”的类通过将 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

4

2 回答 2

0

我最初的想法是你调用 WMI 来找出 IIS 信息:

这个问题/答案如何通过 WMI 获取 IIS 应用程序信息显示了如何执行此操作。

然后,您可以使用此技术http://msdn.microsoft.com/en-us/magazine/cc302051.aspx将其与 SQL Server CLR 集成。

我没有您的特定用例的任何具体示例,但上述链接应该给您足够的开始。

于 2013-08-01T02:16:37.003 回答
0

ServerManager通过简单地绕过类并读取它正在读取的相同配置文件,应该很容易获得此信息。我检查的系统正在运行 IIS 7.0,配置文件位于以下位置:

C:\Windows\System32\inetsrv\config\applicationHost.config

只需加载该 XML,然后使用 XQuery 表达式按照以下方式获取该物理路径:

(/configuration/system.applicationHost/sites/site[@name="Default Web Site"]/application[@path="/utilities"]/virtualDirectory[@path="/"]/@physicalPath)[1]

关于问题中的以下陈述(不是关于具体请求,而是与请求的背景有关):

其中一个特别称为“Text”的类通过将 Unicode 字符串映射到 ASCII 字符串来强制对字段进行 ASCII 编码,并且为了完整起见,它将映射所有 65536 个可能的两字节(16 位)UCS2 代码点值

实际上,没有 65,536 个可能的 UCS-2 字符。UCS-2 中最多有 63,477 个字符。该数字来自使用 2 个字节时的 65,536 个可能值,然后删除:

  • 保留用于创建代理对的 2048 个值(补充字符的来源)
  • 最后 2 个值(0xFFFE 用于字节顺序标记,0xFFFF 不是字符)
  • 从 0xFFF0 到 0xFFF8 的 9 个值(未分配)
  • 详见0xFFF0 - 0xFFFF 的 PDF图表

但是,NCHAR, NVARCHAR, XML, and NTEXT(但不要再使用这个了!)数据类型实际上可以保存完整的 UTF-16 编码。只是在使用名称不以结尾的排序规则时,内置函数无法正确解释非 UCS-2 字符_SC(这些是在 SQL Server 2012 中引入的)。因此,可以在 XML 和N-prefixed 类型中的真正全范围字符实际上是 1,112,064 个代码点(有关详细信息,请参阅UTF-16维基百科)。

于 2015-08-22T06:26:01.050 回答