【问题标题】:Faulted State error while creating component with Core Service使用核心服务创建组件时出现故障状态错误
【发布时间】:2012-04-12 22:47:06
【问题描述】:

在 SDL Tridion 2011 SP1 中使用核心服务时出现“故障状态”错误。以下有什么问题?

namespace coreservice1
{
      public partial class _Default : System.Web.UI.Page
      {
       protected void Page_Load(object sender, EventArgs e)
       {
        try
        {

            using (ChannelFactory<ISessionAwareCoreService> factory =
      new ChannelFactory<ISessionAwareCoreService>("wsHttp_2011"))
            {
                ISessionAwareCoreService client = factory.CreateChannel();
                string SCHEMA_URI = "tcm:7-426-8";

                var schemaFields = client.ReadSchemaFields(SCHEMA_URI, true, new ReadOptions());
                foreach (var field in schemaFields.Fields) 
                { 
                    Response.Write(string.Format("{0}", field.Name));                         
                } 
                Response.Write(schemaFields.NamespaceUri);
                string NEW_COMPONENT_FOLDER_URI = "tcm:8-15-2";

               Tridion.ContentManager.CoreService.Client.ComponentData component = new Tridion.ContentManager.CoreService.Client.ComponentData
               {
                   Schema = new LinkToSchemaData { IdRef = "tcm:8-426-8"},
                   Title = "Helloworldalll",
                   Id = "tcm:0-0-0",
                   LocationInfo = new LocationInfo
                   {
                       OrganizationalItem =
                           new LinkToOrganizationalItemData { IdRef = NEW_COMPONENT_FOLDER_URI}
                   },
               };

               string namespaceUri = schemaFields.NamespaceUri;
               System.Text.StringBuilder content = new StringBuilder();
               string First = "Hello World.This is Fisrt field";
               content.AppendFormat("<{0} xmlns=\"{1}\">", schemaFields.RootElementName, namespaceUri);
               content.AppendFormat("<{0} xmlns=\"{1}\">{2}</{0}>", "first", namespaceUri, First);
               content.AppendFormat("</{0}>", schemaFields.RootElementName);
               component.Content = content.ToString();
               ComponentData comp = (ComponentData)client.Create(component, new ReadOptions());
               string newlyCreatedComponentID = comp.Id;
               Response.Write("Hello hai");
               Response.Write("Id of newly created component: " + newlyCreatedComponentID);
            }

        }

        catch (Exception ex)
        {
            Response.Write(ex.StackTrace);
            Response.Write("exception is " + ex.Message);
        }

    }
  }
}

“在 System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout) 在 System.ServiceModel.Channels.ServiceChannelFactory.OnClose(TimeSpan timeout) 在 System.ServiceModel.Channels.ServiceChannelFactory.TypedServiceChannelFactory`1.OnClose(TimeSpan timeout)在 System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout) 在 System.ServiceModel.ChannelFactory.OnClose(TimeSpan timeout) 在 System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout) 在 System.ServiceModel.ChannelFactory.System.IDisposable .Dispose() at coreservice1._Default.Page_Load(Object sender, EventArgs e) in D:\SampleProjects_Tridion\test\coreservice1\coreservice1\coreservice.aspx.cs:line 73exception是通信对象,System.ServiceModel.Channels.ServiceChannel,无法用于通信,因为它处于故障状态。“

【问题讨论】:

  • "通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信,因为它处于故障状态。"这意味着执行您的代码时出错并且您没有正确处理它。你能分享你使用的代码吗?也值得检查彼得的这篇文章:pkjaer.wordpress.com/2011/11/30/…
  • @NunoLinhares。我已经更新了代码。请看一下。
  • 代码很有帮助。你能指出哪一行是#73吗?错误消息指向第 73 行,但我无法将其映射回此代码片段。
  • @Frank 问题不在第 73 行。问题在于匿名用户和 Windows 用户的身份验证。我为匿名用户和 Windows 用户启用了身份验证。然后错误就解决了。

标签: tridion


【解决方案1】:

我认为这可能与您实例化客户端对象的方式有关。

您可以将其添加为 Visual Studio 中的服务参考:

例如将服务引用添加到 http://{your tridion url}/webservices/CoreService.svc 并给它一个 TridionCoreService 的命名空间,然后你可以这样使用它:

TridionCoreService.CoreService2010Client client = new TridionCoreService.CoreService2010Client();   

您也可以使用here 方法,它允许您创建核心服务引用,而无需配置文件。

【讨论】:

    【解决方案2】:

    发送一个我之前创建的示例以防万一.....

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using CoreWebService.ServiceReference1;
    
    namespace CoreWebService
    {
        class CoreWebServiceSamples
        {
    
            public static void  createComponent()
            {
                string schemaWebDavUrl = "/webdav/020%20Content/Building%20Blocks/Content/wstest/wstest.xsd";
                string folderWebDavUrl = "/webdav/020%20Content/Building%20Blocks/Content/wstest";
    
                CoreServicesUtil coreServicesUtil = new CoreServicesUtil();
    
                FolderData folderData = coreServicesUtil.getFolderData(folderWebDavUrl);
                ComponentData componentData = folderData.AddComponentData();
                componentData.Title = "This is a Test ..... ";
                componentData.Schema = coreServicesUtil.getLinkToSchemaData(schemaWebDavUrl);
    
                SchemaData schemaData = coreServicesUtil.getSchemaData(schemaWebDavUrl);
    
                componentData.Content = xmlUtil.GetNewXmlNode("Content", schemaData.NamespaceUri);
                componentData.Metadata = xmlUtil.GetNewXmlNode("Metadata", schemaData.NamespaceUri);
    
                componentData.AddSingleField("singlefield", "singlefield sample", schemaData.NamespaceUri);
                componentData = (ComponentData)coreServicesUtil.coreServiceClient.Save(componentData, coreServicesUtil.readOptions);
                coreServicesUtil.coreServiceClient.CheckIn(componentData.Id, coreServicesUtil.readOptions);
                coreServicesUtil.coreServiceClient.Close();
            }
        }
    }
    

    CoreServicesUtil.....

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using CoreWebService.ServiceReference1;
    using CoreWebService.Properties;
    using System.Xml;
    using System.Xml.Serialization;
    
    
    
    namespace CoreWebService
    {
    
        public class CoreServicesUtil
        { 
            public CoreService2010Client coreServiceClient;
            public ReadOptions readOptions;
            /// <summary>
            /// 
            /// </summary>
            public CoreServicesUtil()
            {
                this.coreServiceClient = new CoreService2010Client("basicHttp_2010");
                this.readOptions = new ReadOptions();
            }
    
            public  FolderData getFolderData(string tcmuri)
            {
                FolderData folderData = (FolderData)coreServiceClient.Read(tcmuri,ReadOptions);
                return folderData;
            }
            public LinkToSchemaData getLinkToSchemaData(string tcmuri)
            {
                LinkToSchemaData linkToSchemaData = new ServiceReference1.LinkToSchemaData();
                linkToSchemaData.IdRef = getSchemaData(tcmuri).Id;
                return linkToSchemaData;
            }
            public  SchemaData getSchemaData(string tcmuri)
            {
                SchemaData schemaData = (SchemaData)coreServiceClient.Read(tcmuri, readOptions);
                return schemaData;
            }
    
       }
    }
    

    XMLUtil ....

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    
    namespace CoreWebService
    {
        public class xmlUtil
        {
    
            /**
    * <summary>
    * Name: enumeration
    * </summary>
    **/
            public  enum Scope
            {
                Content,
                Metadata
            }
    
    
            /**
     * <summary>
     * Name: AddItemLinkFieldGeneric
     * Description: basic method for add component links, multimedia links, keyword field to an XmlElement
     * </summary>
     **/
    
            /**
            * <summary>
            * Name: getXMLElementData
            * Description: adds a single field to an XmlElement
            * </summary>
            **/
            public static XmlElement getXMLElementData(string dataNode)
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(dataNode);
                return doc.DocumentElement;
            }
    
    
    
            /**
            * <summary>
            * Name: GetNewXmlNode
            * Description: returns an xml element based on the name and schema
            * </summary>
            **/
            public static string GetNewXmlNode(string Name, string Namespace)
            {
                XmlDocument doc = new XmlDocument();
                XmlElement xmlElem = doc.CreateElement(Name, Namespace);
                doc.AppendChild(xmlElem);
                return doc.FirstChild.OuterXml;
            }
    
        }
    }
    

    【讨论】:

      【解决方案3】:

      它真的创建了组件吗?你能做到吗?

      我通常为CoreService写一个包装类,实现IDisposable并在其中使用以下方法:

      private void InitializeClient()
      {
          NetTcpBinding binding = new NetTcpBinding { MaxReceivedMessageSize = 2147483647 };
          XmlDictionaryReaderQuotas quota = new XmlDictionaryReaderQuotas
          {
              MaxStringContentLength = 2147483647,
              MaxArrayLength = 2147483647
          };
          binding.ReaderQuotas = quota;
          _client = new SessionAwareCoreServiceClient(binding, _endpointAddress);
          if (_client != null) _coreServiceVersion = _client.GetApiVersion();
      }
      

      public void Dispose()
      {
          if (_client.State == CommunicationState.Faulted)
          {
              _client.Abort();
          }
          else
          {
              _client.Close();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-08-26
        • 2012-12-30
        • 1970-01-01
        • 2014-03-21
        • 1970-01-01
        • 2016-09-09
        • 2011-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多