CRM Context Object即使在创建新实例时也会保持连接

时间:2016-10-25 16:28:23

标签: c# wcf dynamics-crm crm

我有一个适用于WCF服务的系统,我在其中从客户端获取一些凭据。然后,我尝试使用这些凭据对CRM进行身份验证。如果身份验证失败,我使用预定义的服务帐户,凭据存储在web.config中。

我发现,无论如何,无论我拆除第一个对象多少,第一组凭据都会持续用于任何进一步的请求。我甚至实例化新对象,用using语句包装每个上下文等等。

我已将代码淡化为简单的连接,重试'块,这也遇到了同样的问题。代码如下:

try
{
    var connection = new CrmConnection();
    connection.ServiceUri = new Uri("https://my.crm.dynamics.com/");
    connection.ClientCredentials = new ClientCredentials();
    connection.ClientCredentials.UserName.UserName = "removed1";
    connection.ClientCredentials.UserName.Password = "removed1";

    using (var crm = new CrmOrganizationServiceContext(connection))
    {
        var req = new Microsoft.Crm.Sdk.Messages.WhoAmIRequest();
        var resp = (Microsoft.Crm.Sdk.Messages.WhoAmIResponse)crm.Execute(req);
    }
}

catch (Exception ex) { }

try
{
    var connection = new CrmConnection();
    connection.ServiceUri = new Uri("https://my.crm.dynamics.com/");
    connection.ClientCredentials = new ClientCredentials();
    connection.ClientCredentials.UserName.UserName = "removed2";
    connection.ClientCredentials.UserName.Password = "removed2";

    using (var crm = new CrmOrganizationServiceContext(connection))
    {
        var req = new Microsoft.Crm.Sdk.Messages.WhoAmIRequest();
        var resp = (Microsoft.Crm.Sdk.Messages.WhoAmIResponse)crm.Execute(req);
    }
}
catch (Exception ex) { }

假设removed1不正确且removed2正确无误。第二个调用将立即失败并出现令牌异常,表示无效凭据。如果removed1正确,removed2不正确,则第一个将进行身份验证并获得WhoAmIRequest罚款。然后,removed2应该失败,但它不会,因为它似乎仍然使用旧凭据保持连接。无效凭证仍允许服务发出请求。不好!<​​/ p>

奇怪的是,身份验证的代码在一个单独的项目中。我已将此项目包含在一个简单的控制台应用程序中,一切正常。我只能假设这与WCF服务及其保持连接的方式有关。我尝试过手动处理,调用垃圾收集,设置为空等等。我还尝试使用名称调用的Web配置连接字符串(硬编码2个测试版),尝试手动创建连接字符串设置唯一名称,使用CrmConnection.Parse()

我甚至将我直接使用的代码复制粘贴到控制台应用程序中,并且工作正常。因此,我确信它与WCF服务的行为有关,而不是代码本身。我将类设置为具有

的行为

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

但没有运气。如果它具有任何重要性,则此代码在消息检查器类中运行,该类实现IDispatchMessageInspector

我如何确保能够获得新鲜的课程?感谢。

1 个答案:

答案 0 :(得分:0)

您正在使用CrmConnection类的默认构造函数。执行此操作时,您的连接将按名称缓存。此名称应该是ConnectionStringSettings的名称,但是使用此构造函数,该属性永远不会被设置并保持其默认值,因此始终返回创建的第一个连接对象。

只需使用构造函数的另一个重载,例如使用连接字符串或接受服务URL,凭证等。

CrmConnection类旨在提供一种在配置文件中创建连接字符串的简便方法,类似于数据库连接字符串。它存在问题,已从Dynamics CRM 2016 SDK中删除。