1

命名空间中的CrmServiceClientMicrosoft.Xrm.Tooling.Connector具有一个将连接字符串作为单个参数的构造函数(此处记录: https ://docs.microsoft.com/en-us/dynamics365/customerengagement/on-premises/developer/xrm-tooling/use -connection-strings-xrm-tooling-connect?view=op-9-1)。

此连接字符串与连接字符串的其他用途相似/熟悉(名称/值对由等号分隔并用分号分隔),但我找不到任何可靠的文档来建议转义特殊字符的具体规则。如果在此特定上下文中,连接字符串值必须包含等号或分号,如何转义?虽然有一些关于 SQL 和实体框架连接字符串的文档,但它们在完全不同的上下文中使用,所以我看不出有任何理由相信这些上下文中的文档适用于CrmServiceClient构造函数上下文。

有没有人有指向此上下文的明确文档的指针,和/或在此上下文中的足够经验来冒险进行相当明确的临时描述?

谢谢。

============================添加以响应评论请求

在对上述初始问题的评论中,一位好心的贡献者要求我添加有关我的用户故事的更多细节。要求是我添加自己的构建器/解析器。

我不会创建解析器。解析器将是CrmServiceClient构造函数使用的解析器。它是 Xrm 工具连接器的一部分。

我还没有创建一个构建器来构建将传递给CrmServiceClient构造函数的连接字符串。我的第一个任务是为该构建器创建一个单元测试,以确定它是否正确构建,这就是为什么我希望解析器强制执行明确的规则。

采取以下示例连接字符串:

AuthType=OAuth;Username=jsmith@contoso.onmicrosoft.com; Password=passcode;Url=https://contosotest.crm.dynamics.com;AppId=51f81489-12ee-4a9e-aaae-a2591f45987d; RedirectUri=app://58145B91-0C36-4500-8554-080854F2AC97;LoginPrompt=Auto

在这个基本示例中,连接字符串的键/值对集中没有任何值,其中包含任何特殊字符,因此无需转义。但是现在让我们想象一下,Password 不是字符串“passcode”,而是充满了特殊字符。假设密码是

"aB4$;";~^''dEfg'!

该密码本身以双引号开头,其中有另一个双引号,有两个单引号和两个分号。期望密码可能包含这样的字符并非没有道理。如果传递给CrmServiceClient构造函数的连接字符串正是这样的:

AuthType=OAuth;Username=jsmith@contoso.onmicrosoft.com; Password="aB4$;";~^''dEfg'!;Url=https://contosotest.crm.dynamics.com;AppId=51f81489-12ee-4a9e-aaae-a2591f45987d; RedirectUri=app://58145B91-0C36-4500-8554-080854F2AC97;LoginPrompt=Auto

然后肯定会被错误地解析。

这是我试图通过CrmServiceClient构造函数解析器使用的一组明确规则来解决的问题。

4

1 回答 1

1

推断但没有记录和保证的答案:

我反编译了 XRM Toolkit 代码和有问题的构造函数。看起来,在幕后,微软正在使用相同的解析器,用于数据库等的连接字符串,在System.Data.

此外,还有一个公共(但未记录)扩展方法,它将CrmServiceClient连接字符串作为参数并返回Dictionary<string,string>从连接字符串中解析出来的键/值对。那个方法是: Microsoft.Xrm.Tooling.Connector.Extension.ToDictionary()

通过使用该方法,我可以确定以下内容作为一组可用于构建连接字符串的事实规则:

  1. 连接字符串值可以总是用单引号括起来。
  2. 如果连接字符串值中包含任何特殊字符,则必须用单引号括起来。(注意——双引号也是可以接受的,但我使用单引号是为了我的目的。)
  3. 特殊字符肯定包括前导和尾随空格、分号和单引号。此列表可能并不详尽。
  4. 如果您需要在连接字符串值中包含单引号,则必须将其加倍以对其进行转义。
于 2021-07-07T16:39:21.337 回答