有没有人使用 LINQPad 连接到 Tridion 核心服务?

Posted

技术标签:

【中文标题】有没有人使用 LINQPad 连接到 Tridion 核心服务?【英文标题】:Has anyone used LINQPad to connect to Tridion Core Services? 【发布时间】:2012-03-29 01:57:48 【问题描述】:

我爱LINQPad!我正在尝试使用 LINQPad 中的 WCF 连接器连接到 Tridion Core Services,以帮助我快速开发和学习 Core。

目前,LINQPad 报告 URI 的 404(未找到)错误,但这个相同的 URI 在我的浏览器中有效。

还有其他人成功连接吗?

LINQPad 的连接窗口

【问题讨论】:

【参考方案1】:

LINQPad 现在是我通过其核心服务 API 与 Tridion 交互的首选工具。

如果您只是download a plain LINQPad,它可以连接到 WCF 数据服务(通常称为 OData 源)、SQL Server 数据库和 Azure 数据服务市场。由于 Tridion 的核心服务不是这些类型,因此您无法创建到它的持久连接。

但您仍然可以按照以下步骤使用 LINQPad 作为 Visual Studio 的轻量级替代品:

    将 LINQPad 的语言切换为“C# 程序” 粘贴下面的代码sn-p 从代码 sn-p 添加必要的 DLL 引用 从代码 sn-p 添加必要的命名空间引用 为主机名、用户名和密码指定您自己的值 编写您的代码

LINQPad 可以处理多种语言。它默认为“C# 表达式”,这意味着您只需在代码面板中指定一个“语句”。这在与例如工作时效果很好。 SQL 数据库,其驱动程序可用,但不足以与 Tridion 的核心服务交互。因此,首先您需要在查询顶部的工具栏中将其从“C# 表达式”语言切换为“C# 程序”语言。

切换语言后,我通常从以下样板开始

void Main()

    // System.Runtime.Serialization.dll
    // System.ServiceModel.dll
    // System.Net.dll
    // Namespaces:
    // System.Net
    // System.ServiceModel
    // Tridion.ContentManager.CoreService.Client
    var binding = new NetTcpBinding  MaxReceivedMessageSize = 2147483647, ReaderQuotas = new XmlDictionaryReaderQuotas  MaxStringContentLength = 2147483647, MaxArrayLength = 2147483647  ;
    var endpoint = new EndpointAddress("net.tcp://<hostname>:2660/CoreService/2011/netTcp");
    var DEFAULT_READ_OPTIONS = new ReadOptions();

    CoreServiceClient client = new CoreServiceClient(binding, endpoint);
    client.ChannelFactory.Credentials.Windows.ClientCredential = new NetworkCredential("<username>", "<password>");
    try 
        // TODO: fill in the blanks
     finally 
        if (client.State == CommunicationState.Faulted) client.Abort(); else client.Close();
        

粘贴此代码后,打开“查询属性”窗口 (F4) 并将 System.Runtime.Serialization.dllSystem.ServiceModel.dllSystem.Net.dll 添加到“附加引用”选项卡。确保您的机器上有 Tridion.ContentManager.CoreService.Client.dll 的副本,并添加对它的引用。 (您可以在服务器上的 Tridion/bin/client 中找到它)

System.NetSystem.ServiceModelTridion.ContentManager.CoreService.Client 添加到 Additional Namespace Imports 选项卡。

更改代码中的&lt;hostname&gt;&lt;username&gt;&lt;password&gt;值,测试连接是否成功。

在此之后,填空并开始享受核心服务 API 的乐趣。

我建议始终保持核心服务 API 文档(CHM 格式)打开。有了那个打开,我发现即使没有自动完成,我也能走得很远。如果您保存刚刚创建的查询,您可以轻松地使用 ctrl-shift-C 克隆它,并使用已填写的语言、DLL 引用和命名空间进行新的查询。

更新

现在记录了从 LINQPad 连接到 Tridion 的更简单方法:https://sdltridionworld.com/articles/sdltridion2011/using_linqpad_with_tridion.aspx

【讨论】:

伟大的东西弗兰克。我只是通过用 Console.WriteLine(client.GetApiVersion()); 替换 TODO 来解决问题。这是一种享受。现在进行一些更有趣的查询! 试试这个:client.GetListXml("tcm:0-8-1", new RepositoryItemsFilterData Recursive=true, ItemTypes = new[] ItemType.Schema , SchemaPurposes= new [] SchemaPurpose.Component ) .Elements() .Select(elm =&gt; new ID=elm.Attribute("ID").Value, Title=elm.Attribute("Title").Value, Fields=String.Join(", ", client.ReadSchemaFields(elm.Attribute("ID").Value).Fields.Select(field =&gt; field.Name)) ) 找出我连接的 TCM 内容模型的最快方法。 好一个弗兰克。我需要向 ReadSchemaFields 添加一些参数以使其工作。确定你发布了正确的版本? ReadSchemaFields(elm.Attribute("ID").Value, true, null) 为我工作。 我收到“对 SSPI 的调用失败,请参阅内部异常。”在 System.Net.Security.NegoState.StartSendAuthResetSignal(LazyAsyncResult lazyResult, Byte[] message, Exception exception) 在 System.Net.Security.NegoState.StartSendBlob(Byte[] message, LazyAsyncResult lazyResult) 任何建议 我的第一个建议是您打开一个新问题。请在其中包含足够的信息,以便有人尝试重现此问题。您可能还想对错误消息进行一些搜索,因为它听起来与 Tridion 的核心服务和更多 .NET/WCF 无关,并且与您的基础架构/安全设置有关。【参考方案2】:

通读:http://markistaylor.com/2010/09/09/linqpad-beyond-linq/ 似乎您可以通过添加对 System.ServiceModel.dll 和 [Tridion_Home]\bin\client\Tridion.ContentManager.CoreService.Client.dll 的引用来做到这一点(在查询 -> 查询属性)到 LINQPad。

【讨论】:

而 404 可能是因为 LINQPad 正在搜索 CoreService 中不存在的 /$metadata 我同意。请记住,核心服务是使用 WCF 3.5 实现的,它使用 SOAP 作为默认值。 “将以 Web 为中心的通信与 SOAP 和 WS-* 标准结合到一个服务堆栈和对象模型中,这是使 .NET Framework 3.5 中的 WCF 如此引人注目的特性之一”,msdn.microsoft.com/en-us/magazine/cc135976.aspx 注意:Tridion.ContentManager.CoreService.Client.dll 可用于 SDL Tridion 2011 SP1。如果在 2011 GA 或 Hotfix Rollup 上,我们必须自己生成客户端 dll。 从文章中,我遵循了“使用 LINQPad 调用 WCF 服务”。这正是我所需要的。我会对这篇文章做一点小改动。我会添加开关“out”,以便将编译后的 DLL 保存在更方便的位置。 SVCUTIL /config: /mergeConfig /out: csc /t:library /out: I没有以任何方式使用文章的代码。我使用来自 Albert Romkes(SDL 论坛)的代码并创建了一个简单的函数来封装该代码。 我使用 5 种不同的架构创建了 2,700 多个组件【参考方案3】:

您可以检查内容管理器的 IIS 日志 - 您是否看到 LINQPaD 连接尝试中的 404?页面真的存在吗?

【讨论】:

以上是关于有没有人使用 LINQPad 连接到 Tridion 核心服务?的主要内容,如果未能解决你的问题,请参考以下文章

使用?wsdl URI查询将LinqPad连接到WCF Web服务

LinqPad 可以连接到 mdf 文件吗?

Linqpad - Linq to Sql Ambiguous表和链接服务器名称

LINQPad [扩展] 方法 [关闭]

使用 ODBC 从 Web 服务器连接到 MS Access 数据库时找不到数据源名称

无法使用 RPostgreSQL 连接到 AWS Redshift