Search code examples
asp.netdynamics-crmdynamics-crm-4

Dynamics crmservice asmx and caching


I have a custom app which uses the crmservice.asmx to retrieve contacts from dynamics crm 4.

The problem: I search for the contact in my custom app and don't find it. I go to MSCRM and create the contact. When I then try to search again in my custom app, I still can't find the contact.

It has to be cache for the crmservice.asmx because when I try 10 minutes later, the contact is found in my custom app.

But how do I manage the cache settings on the crmservice.asmx?

My code for instantiating

Private Const CRMServiceUrl As String = "https://*****/mscrmservices/2007/crmservice.asmx"
Private Const MetadataServiceUrl As String = "https://*****/MSCRMServices/2007/MetadataService.asmx"
Private Const OrganizationName As String = "****"
Private Const Username As String = "****"
Private Const Password As String = "****"
Private Const Domain As String = "****"

Private ReadOnly _service As CrmService.CrmService
Private ReadOnly _metadataService As MetadataService.MetadataService


Public Sub New()
    Dim crmServiceToken As New CrmAuthenticationToken()
    crmServiceToken.AuthenticationType = Microsoft.Crm.Sdk.AuthenticationType.AD
    crmServiceToken.OrganizationName = OrganizationName

    Dim metadataServiceToken As New MetadataService.CrmAuthenticationToken()
    metadataServiceToken.AuthenticationType = Microsoft.Crm.Sdk.AuthenticationType.AD
    metadataServiceToken.OrganizationName = OrganizationName

    Dim credentials As ICredentials = New NetworkCredential(Username, Password, Domain)

    _service = New CrmService.CrmService()
    _service.Url = CRMServiceUrl
    _service.CrmAuthenticationTokenValue = crmServiceToken
    _service.Credentials = credentials

    _metadataService = New MetadataService.MetadataService()
    _metadataService.Url = MetadataServiceUrl
    _metadataService.CrmAuthenticationTokenValue = metadataServiceToken
    _metadataService.Credentials = credentials
End Sub

and the method that gets contacts

Public Function GetContact(ByVal request As GetContactRequest) As contact Implements ICRM.GetContact
    Dim query As New QueryExpression()
    query.EntityName = EntityName.contact.ToString()
    query.ColumnSet = New AllColumns()

    Dim condition As ConditionExpression
    Dim expr As New List(Of ConditionExpression)

    condition = New ConditionExpression()
    condition.AttributeName = "statecode"
    condition.[Operator] = ConditionOperator.Equal
    condition.Values = New Object() {0}
    expr.Add(condition)

    If request.ContactId <> Guid.Empty Then
        condition = New ConditionExpression()
        condition.AttributeName = "contactid"
        condition.[Operator] = ConditionOperator.Equal
        condition.Values = New String() {request.ContactId.ToString}
        expr.Add(condition)
    End If
    If Not String.IsNullOrEmpty(request.CustomerCode) Then
        condition = New ConditionExpression()
        condition.AttributeName = "new_orgcustomerno"
        condition.[Operator] = ConditionOperator.Like
        condition.Values = New String() {request.CustomerCode + "%"}
        expr.Add(condition)
    End If

    If Not String.IsNullOrEmpty(request.ContactSeq) Then
        condition = New ConditionExpression()
        condition.AttributeName = "new_contact_seq"
        condition.[Operator] = ConditionOperator.Like
        condition.Values = New String() {request.ContactSeq + "%"}
        expr.Add(condition)
    End If


    Dim filter As New FilterExpression()
    filter.FilterOperator = LogicalOperator.[And]
    filter.Conditions = expr.ToArray

    query.Criteria = filter
    Dim contacts As BusinessEntityCollection = _service.RetrieveMultiple(query)

    If contacts.BusinessEntities.Length > 0 Then
        Dim a As contact = DirectCast(contacts.BusinessEntities(0), contact)
        Return a
    Else
        Return Nothing
    End If
End Function

Solution

  • solved: by using Retrieve() instead of RetrieveMultiple() I get the contact at once.

    this means that by searching for the newly created contact by other columns, I can't access it at once (have to wait a couple of minutes). I have to use the contactid.