6

私は Tridion 2011 SP1 を使用しており、次のコードを使用して CoreService に接続しています。

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

しかし、次のような簡単な操作をしようとすると:

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

以下のエラーメッセージが表示されます。

"{"アクション 'http://www.sdltridion.com/ContentManager/CoreService/2011/ICoreService/Create' を含むメッセージは、EndpointDispatcher での ContractFilter の不一致により、受信側で処理できません。これは、コントラクトの不一致 (送信者と受信者の間のアクションの不一致) または送信者と受信者の間のバインディング/セキュリティの不一致が原因である可能性があります。送信者と受信者が同じコントラクトと同じバインド (メッセージ、トランスポート、なしなどのセキュリティ要件を含む) を持っていることを確認してください。"}"

何か案は?

完全なコードはこちら:

            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 - フランクの提案で、これを 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 に答える