【问题标题】:How to escape special characters in connection string passed to CrmServiceClient constructor如何转义传递给 CrmServiceClient 构造函数的连接字符串中的特殊字符
【发布时间】:2021-07-07 00:35:23
【问题描述】:

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

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

有没有人有关于此上下文的权威文档的指针,和/或有足够的经验在此上下文来冒险一个相当明确的临时描述?

谢谢。

===========================为回应评论请求而添加

在上面第一个问题的 cmets 中,一位好心的贡献者要求我添加更多关于我的用户故事的细节。要求是我添加自己的构建器/解析器。

我不会创建解析器。解析器将是 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 构造函数解析器使用的一组明确规则来解决的问题。

【问题讨论】:

  • 到目前为止你尝试过什么?成功了吗?
  • 我需要编写一个通用的连接字符串构建器,它本身将获取与不同键相关的参数(AKA 值),然后从中生成一个连接字符串。我当然可以把意大利面扔在墙上并尝试很多事情,但是我可以编写单元测试套件的一组明确定义的规则将非常有帮助。
  • 连接字符串只是一个字符串,消费者库负责构建/解析它。作为图书馆的用户,您为什么如此关心格式?
  • @LeiYang - 我知道这一点。但是,如果连接字符串中包含密码,并且该密码中包含分号,则该分号将告诉连接字符串解析器该值已结束,除非以某种方式对其进行转义。还有以空格开头或结尾的值或带有等号的键名......这些都是需要转义的问题。这通常是一个众所周知的问题,但我没有看到适用于用作CrmServiceClient 构造函数参数的连接字符串的规则和约定的具体文档。
  • 当你谈到逃跑时,你的真正意思是什么?你的意思是在 xml 中转义?

标签: c# dynamics-crm dynamics-365 xrm-tooling-connector


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 看起来像逆向工程
  • 是的,这就是我特别不喜欢它的原因。我宁愿有官方文档而不是推断逆向工程。
猜你喜欢
  • 1970-01-01
  • 2017-04-02
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多