6

我正在使用 Tridion 2011 SP1 并使用此处的代码连接到 CoreService:

http://code.google.com/p/tridion-practice/wiki/GetCoreServiceClientWithoutConfigFile

但是当我尝试做任何简单的操作时,例如:

XElement resultXml = _coreService.GetListXml(publicationId, filterData);

我收到以下错误消息。

"{"由于 EndpointDispatcher 的 ContractFilter 不匹配,接收方无法处理带有 Action 'http://www.sdltridion.com/ContentManager/CoreService/2011/ICoreService/Create' 的消息。这可能是因为合约不匹配(发送方和接收方之间的操作不匹配)或发送方和接收方之间的绑定/安全不匹配。检查发送方和接收方是否具有相同的合同和相同的绑定(包括安全要求,例如消息、传输、无)。"}"

有任何想法吗?

完整代码在这里:

            RepositoryItemsFilterData filterData = new RepositoryItemsFilterData();
            filterData.ItemTypes = new[]
                           {
                             ItemType.Component,
                             ItemType.Schema
                           };
            filterData.Recursive = true;

             ICoreService _coreService = GetNewClient(); 
             XElement resultXml = _coreService.GetListXml(publicationId, filterData);


       private ICoreService GetNewClient()
        {
            var binding = new BasicHttpBinding()
            {
                MaxBufferSize = 4194304, // 4MB
                MaxBufferPoolSize = 4194304,
                MaxReceivedMessageSize = 4194304,
                ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas()
                {
                    MaxStringContentLength = 4194304, // 4MB
                    MaxArrayLength = 4194304,
                },
                Security = new BasicHttpSecurity()
                {
                    Mode = BasicHttpSecurityMode.TransportCredentialOnly,
                    Transport = new HttpTransportSecurity()
                    {
                        ClientCredentialType = HttpClientCredentialType.Windows,
                    }
                }
            };
            _hostname = string.Format("{0}{1}{2}", _hostname.StartsWith("http") ? "" : "http://", _hostname, _hostname.EndsWith("/") ? "" : "/");
            var endpoint = new EndpointAddress(_hostname + "webservices/CoreService.svc/basicHttp_2010");
            ChannelFactory<ICoreService> factory = new ChannelFactory<ICoreService>(binding, endpoint);
            factory.Credentials.Windows.ClientCredential = new System.Net.NetworkCredential(_username, _password);
            return factory.CreateChannel();
        }



更新: 感谢 Nuno 和 Frank 的回复,我现在通过添加服务引用使其工作,只是有点好奇为什么我的代码不起作用,因为它创建了以下绑定,据我所知(我很可能错过了一些东西)上面的代码
同样适用于 Nuno 的方法 - 谢谢 Nuno。

<basicHttpBinding> <binding name="basicHttp_2010"> <security mode="TransportCredentialOnly"> <transport clientCredentialType="Windows" /> </security> </binding> </basicHttpBinding>

4

4 回答 4

5

这不是您问题的答案,但这是我现在与核心服务客户打交道的方式:

  1. 添加对 [Tridion]\bin\client\Tridion.ContentManager.CoreService.Client.dll 的引用
  2. 将[Tridion]\bin\client\Tridion.ContentManager.CoreService.Client.dll.Config的内容复制到我自己的app.config中

然后在代码中这样做:

SessionAwareCoreServiceClient client = new SessionAwareCoreServiceClient("netTcp_2011");

完毕。

PS - 根据 Frank 的建议,将此添加到 Tridion Practice wiki:http ://code.google.com/p/tridion-practice/wiki/GetCoreServiceClientWithConfigFile

于 2012-09-18T19:48:35.567 回答
3

看起来您创建的绑定不符合服务器的预期。查看 TCM 服务器上的 .config 并确保客户端创建相同类型的绑定。

于 2012-09-18T19:48:09.127 回答
1

您正在连接到错误的端点。您无法使用“2011”客户端连接到“2010”版本的核心服务。

您应该改为连接到 2011 端点 (.../webservices/CoreService2011.svc/basicHttp)

当然,您也可以更改对 2010 版客户端的引用,但除非您遇到问题,否则我不会这样做。

于 2012-09-24T14:23:53.807 回答
0

我通过在我的应用程序配置中将 /CoreService/2012/ 更改为 /CoreService/2013/ 修复了同样的错误:

<endpoint name="netTcp_2012" address="net.tcp://localhost:2660/CoreService/2013/netTcp" binding="netTcpBinding" bindingConfiguration="netTcp" contract="Tridion.ContentManager.CoreService.Client.ISessionAwareCoreService" />

我怀疑我最初在 Tridion 2011 中创建了我的核心服务应用程序,然后我尝试使用 Tridion 2013 运行它。

于 2016-03-02T20:52:06.860 回答