Получение данных из CRM (по прокси) из WCF service throws ошибки

Ситуация: я работаю над Dynamics CRM 2016 Online. Я вызываю плагин для statechange сущности. В этом плагине я вызываю внешнюю службу WCF (которая размещена в Azure). Код, который я использую для этого:

private void AddToIndex(EntityReference canRef)
        {
            ChannelFactory<ServiceReference1.IIndexing> factory = GetFactory();
            var channel = factory.CreateChannel();
            channel.IndexOneCandidate(canRef.Id);
            factory.Close();
        }

        private ChannelFactory<ServiceReference1.IIndexing> GetFactory()
        {
            BasicHttpBinding myBinding = new BasicHttpBinding();
            myBinding.Name = "BasicHttpBinding_IndexingService";
            myBinding.Security.Mode = BasicHttpSecurityMode.None;
            myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
            myBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
            myBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;

            EndpointAddress endPointAddress = new EndpointAddress("http://<correcturl>/indexing.svc");
            ChannelFactory<ServiceReference1.IIndexing> factory = new ChannelFactory<ServiceReference1.IIndexing>(myBinding, endPointAddress);
            return factory;
        }

Я включил ссылку.cs-файл, созданный svutil.

В этой службе мне нужно получить данные из CRM, чтобы использовать его для передачи данных еще одной (внешней) службе. Я делаю это, создавая прокси-сервер службы:

IOrganizationService service = new OrganizationService("<orgname>");

Для этого я использую connectionstring, который находится в моем интернете.конфигурация сервиса.

Теперь о странной части: все работает хорошо, когда я выполняю действие setstate в живой производственной среде. Тем не менее, я получил билеты моего, кто получил следующую ошибку:

<s:Envelope >
    <s:Body>
        <s:Fault>
            <faultcode>s:Client</faultcode>
            <faultstring xml_lang="en-US">Unexpected exception from plug-in (Execute): Plugin.Candidate.UpdateIndexOnStateChange: System.Security.SecurityException: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.</faultstring>
            <detail>
                <OrganizationServiceFault  >
                    <ErrorCode>-2147220956</ErrorCode>
                    <ErrorDetails />
                    <Message>Unexpected exception from plug-in (Execute): Plugin.Candidate.UpdateIndexOnStateChange: System.Security.SecurityException: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.</Message>
                    <Timestamp>2016-11-07T08:52:50.0726198Z</Timestamp>
                    <InnerFault i_nil="true"/>
                    <TraceText>
    [Plugin.Candidate: Plugin.Candidate.UpdateIndexOnStateChange]
    [2b70fb94-1d9c-e611-8107-5065f38a3b11: Plugin.Candidate.UpdateIndexOnStateChange: SetStateDynamicEntity of candidate]

                    </TraceText>
                </OrganizationServiceFault>
            </detail>
        </s:Fault>
    </s:Body>
</s:Envelope>

Я озадачен, потому что я использую пользователя с точно такими же правами и ролями в CRM для выполнения этого действия, однако мой клиент, использующий эту же роль, получает эту ошибку. Что еще более раздражает: я не могу воспроизвести эту ошибку, так как с моей стороны все работает хорошо. Кто-нибудь знает, что происходит?

1 ответ

  1. Похоже, ваше исключение находится в Plugin.Candidate.UpdateIndexOnStateChangeплагине, на SetStateDynamicEntity кандидата. Независимо от того, что делает этот плагин, требует прав базы данных, которых у него нет.

    Запрос разрешения типа ‘ System.Данные.SqlClient.SqlClientPermission, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’ не удалось.

    Если плагин работает под как вызывающий пользователь, это объяснило бы, почему он будет работать для некоторых людей, а не для других.