是否可以在没有 SDK 的情况下调用 Dynamics CRM 2011 后期绑定 WCF 组织服务 - 直接自定义绑定?

Posted

技术标签:

【中文标题】是否可以在没有 SDK 的情况下调用 Dynamics CRM 2011 后期绑定 WCF 组织服务 - 直接自定义绑定?【英文标题】:Is it possible to call Dynamics CRM 2011 late-bound WCF Organization service without the SDK - straight customized binding? 【发布时间】:2011-10-10 04:34:33 【问题描述】:

我正在尝试实现一个纯 WCF 场景,我想在不依赖 SDK 帮助程序类的情况下调用 Dynamics CRM WCF 服务。基本上,我想针对 Dynamics CRM 2011 实施联合身份验证,仅使用来自 .net 框架的本机 WCF 支持。

我这样做的原因是我想稍后将此场景移植到 BizTalk。

我已经使用 SvcUtil 成功生成了代理类,但是部分策略和安全断言与配置架构不兼容。 SvcUtil 建议改为从代码构建绑定,这是我正在尝试做的。

生成的代码在这里:

        private static void CallWcf()
    
        OrganizationServiceClient client = null;

        try
        
            // Login Live.com Issuer Binding

            var wsHttpBinding = new WSHttpBinding();
            wsHttpBinding.Security = new WSHttpSecurity();
            wsHttpBinding.Security.Mode = SecurityMode.Transport;

            // Endpoint Binding Elements

            var securityElement = new TransportSecurityBindingElement();
            securityElement.DefaultAlgorithmSuite = SecurityAlgorithmSuite.TripleDes;
            securityElement.IncludeTimestamp = true;
            securityElement.KeyEntropyMode = SecurityKeyEntropyMode.CombinedEntropy;
            securityElement.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10;
            securityElement.SecurityHeaderLayout = SecurityHeaderLayout.Strict;

            var securityTokenParameters = new IssuedSecurityTokenParameters();
            securityTokenParameters.InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient;
            securityTokenParameters.ReferenceStyle = SecurityTokenReferenceStyle.Internal;
            securityTokenParameters.RequireDerivedKeys = false;
            securityTokenParameters.TokenType = null;
            securityTokenParameters.KeyType = SecurityKeyType.SymmetricKey;
            securityTokenParameters.KeySize = 192;
            securityTokenParameters.IssuerAddress = new EndpointAddress("https://login.live.com/extSTS.srf");
            securityTokenParameters.IssuerMetadataAddress = null;
            securityTokenParameters.DefaultMessageSecurityVersion = null;
            securityTokenParameters.IssuerBinding = wsHttpBinding;

            securityElement.EndpointSupportingTokenParameters.Signed.Add(securityTokenParameters);

            var textMessageEncodingElement = new TextMessageEncodingBindingElement();
            textMessageEncodingElement.MaxReadPoolSize = 64;
            textMessageEncodingElement.MaxWritePoolSize = 16;
            textMessageEncodingElement.MessageVersion = MessageVersion.Default;
            textMessageEncodingElement.WriteEncoding = System.Text.Encoding.UTF8;

            textMessageEncodingElement.ReaderQuotas.MaxStringContentLength = 8192;
            textMessageEncodingElement.ReaderQuotas.MaxArrayLength = 16384;
            textMessageEncodingElement.ReaderQuotas.MaxBytesPerRead = 4096;
            textMessageEncodingElement.ReaderQuotas.MaxNameTableCharCount = 16384;

            var httpsTransportElement = new HttpsTransportBindingElement();
            httpsTransportElement.ManualAddressing = false;
            httpsTransportElement.AuthenticationScheme = System.Net.AuthenticationSchemes.Anonymous;

            CustomBinding binding = new CustomBinding();
            binding.Elements.Add(securityElement);
            binding.Elements.Add(textMessageEncodingElement);
            binding.Elements.Add(httpsTransportElement);

            client = new OrganizationServiceClient(binding, new EndpointAddress(EndpointUri));
            client.ClientCredentials.UserName.UserName = Username;
            client.ClientCredentials.UserName.Password = Password;
            client.Open();

            var columnSet = new schemas.microsoft.com.xrm._2011.Contracts.ColumnSet();
            var identifier = new Guid("fbf8240e-2c85-e011-ad55-1cc1de0878eb");

            columnSet.Columns = new string[]  "name" ;
            var entity = client.Retrieve("account", identifier, columnSet);
        

        finally
        
            if (client != null)
                client.Close();
        
    

我是联合身份验证的新手,很难弄清楚许多可用绑定之间的潜在差异,因此我将不胜感激在这方面的任何帮助。

【问题讨论】:

你有没有发现如何做到这一点? 还有,你指的是什么 SDK 帮助类? 我没有追求这个,也从来没有发现。我所说的 SDK Helper Classes 是 CRM 2011 SDK 附带的各种示例。 @MaximeLabelle 您是否仍然对如何执行此操作感兴趣,或者问题是否消失了? 我还是很感兴趣... 【参考方案1】:

这可能是可能的,但非常复杂。我们有一个使用 Dynamics 的项目,该项目移至 ADFS,需要围绕刷新令牌添加大量额外代码(来自 SDK 的代码形式 autorefreshsecuritytoken.cs、deviceidmanager.cs 和 toolserviceproxies.cs),并且仍在使用 SDK 处理所有内容。

请记住,您还需要在操作系统中安装 windows.identification,这是要复制的另一个功能负载。

最后,您总是可以使用 JustDecompile 或类似工具来查看 SDK 正在做什么。

【讨论】:

以上是关于是否可以在没有 SDK 的情况下调用 Dynamics CRM 2011 后期绑定 WCF 组织服务 - 直接自定义绑定?的主要内容,如果未能解决你的问题,请参考以下文章

在没有 Roximity SDK 的情况下检测 Roximity iBeacon?

如何在没有 Firebase SDK(即通过 REST)的情况下生成 FCM 注册令牌?

没有客户端组件的基于 IBM MFP 适配器的身份验证

在 JobIntentService 中可以在没有 onHandleWork() 的情况下调用 onDestroy() 吗?

如何在没有 SDK 的情况下为 webjobs 设置警报

Facebook api ios-sdk,代表不工作,没有调用 fbDidLogin