有没有人使用 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.dll
、System.ServiceModel.dll
和 System.Net.dll
添加到“附加引用”选项卡。确保您的机器上有 Tridion.ContentManager.CoreService.Client.dll 的副本,并添加对它的引用。 (您可以在服务器上的 Tridion/bin/client 中找到它)
将 System.Net
、System.ServiceModel
和 Tridion.ContentManager.CoreService.Client
添加到 Additional Namespace Imports 选项卡。
更改代码中的<hostname>
、<username>
和<password>
值,测试连接是否成功。
在此之后,填空并开始享受核心服务 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 => new ID=elm.Attribute("ID").Value, Title=elm.Attribute("Title").Value, Fields=String.Join(", ", client.ReadSchemaFields(elm.Attribute("ID").Value).Fields.Select(field => 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:您可以检查内容管理器的 IIS 日志 - 您是否看到 LINQPaD 连接尝试中的 404?页面真的存在吗?
【讨论】:
以上是关于有没有人使用 LINQPad 连接到 Tridion 核心服务?的主要内容,如果未能解决你的问题,请参考以下文章
使用?wsdl URI查询将LinqPad连接到WCF Web服务
Linqpad - Linq to Sql Ambiguous表和链接服务器名称