簡體   English   中英

CRM上下文對象即使在創建新實例時也能保持連接

[英]CRM Context Object persists connection even when creating new instance

我有一個用於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罰款。 然后,remove2應該失敗,但不會失敗,因為它似乎仍然使用舊憑據保存連接。 無效的憑據仍然允許服務發出請求。 不好!

奇怪的是,用於身份驗證的代碼在一個單獨的項目中。 我已經將該項目包含在一個簡單的控制台應用程序中,並且一切正常。 我只能假定這與WCF服務及其保持連接的方式有關。 我嘗試過手動處理,調用垃圾回收,設置為null等。我還嘗試過使用按名稱調用的Web配置連接字符串(硬編碼2個測試字符串),嘗試使用唯一名稱手動創建具有唯一名稱的連接字符串設置CrmConnection.Parse()

我什至已經將我正在使用的代碼直接復制粘貼到控制台應用程序中,並且工作正常。 因此,我確信這與WCF服務的行為有關,而與代碼本身無關。 我將類設置為具有以下行為

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

但是沒有運氣。 如果有任何重要性,此代碼將在實現IDispatchMessageInspector的消息檢查器類中運行。

如何確保可以重新參加課程? 謝謝。

您正在使用CrmConnection類的默認構造函數。 這樣做時,您的連接將按名稱緩存。 該名稱應該是ConnectionStringSettings的名稱,但是使用此構造函數時,永遠不會設置屬性並保留其默認值,因此始終返回創建的第一個連接對象。

只需使用構造函數的另一個重載即可,例如,使用連接字符串或接受服務url,憑據等。

CrmConnection類旨在提供一種簡單的方法來在配置文件中創建連接字符串,類似於數據庫連接字符串。 它存在問題,已從Dynamics CRM 2016 SDK中刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM