2012-03-29 3 views
5

Tôi nhận được lỗi "trạng thái bị lỗi" khi làm việc với Dịch vụ cốt lõi trong Phiên bản SDL 2011 SP1. Có vấn đề gì sau đây?Lỗi trạng thái bị lỗi khi tạo thành phần với Dịch vụ chính

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); 
     } 

    } 
    } 
} 

“tại System.ServiceModel.Channels.CommunicationObject.Close (TimeSpan timeout) tại System.ServiceModel.Channels.ServiceChannelFactory.OnClose (TimeSpan timeout) tại System.ServiceModel.Channels.ServiceChannelFactory.TypedServiceChannelFactory`1 .OnClose (TimeSpan timeout) tại System.ServiceModel.Channels.CommunicationObject.Close (TimeSpan timeout) tại System.ServiceModel.ChannelFactory.OnĐóng (TimeSpan timeout) tại System.ServiceModel.Channels.CommunicationObject.Close (TimeSpan timeout) tại System.ServiceModel .ChannelFactory.System.IDisposable.Dispose() tại coreservice1._Default.Page_Load (Đối tượng người gửi, EventArgs e) trong D: \ SampleProjects_Tridion \ test \ coreservice1 \ coreservice1 \ coreservice.aspx.cs: dòng 73exception là Giao tiếp Không thể sử dụng đối tượng, System.ServiceModel.Channels.ServiceChannel để liên lạc vì nó ở trạng thái Lỗi. ”

+0

"Các đối tượng giao tiếp, System.ServiceModel.Channels.ServiceChannel, không thể được sử dụng để liên lạc vì nó là trong tình trạng đứt gãy." Điều này có nghĩa là đã xảy ra lỗi khi thực thi mã của bạn và bạn đã không xử lý mã đó đúng cách. Bạn có thể chia sẻ mã bạn đã sử dụng không? Cũng đáng xem bài đăng này từ Peter: http://pkjaer.wordpress.com/2011/11/30/core-service-clients-and-the-using-statement/ –

+0

@NunoLinhares. Tôi đã cập nhật mã. Plz đã hiểu nó. – Patan

+0

Mã này khá hữu ích. Bạn có thể vui lòng chỉ ra dòng nào là # 73? Thông báo lỗi trỏ tới dòng 73, nhưng tôi không thể ánh xạ nó trở lại đoạn mã này. –

Trả lời

5

Tôi nghĩ điều này có thể liên quan đến cách bạn khởi tạo đối tượng khách hàng của mình.

Bạn có thể thêm thông tin này dưới dạng tham chiếu dịch vụ trong Visual Studio:

ví dụ: Thêm dịch vụ tham khảo địa chỉ http: // {url tridion của bạn} /webservices/CoreService.svc và cung cấp cho nó một không gian tên của TridionCoreService, sau đó bạn có thể sử dụng nó như thế này:

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

Hoặc bạn có thể sử dụng phương pháp here mà cho phép bạn tạo tham chiếu Dịch vụ cốt lõi mà không cần tệp cấu hình.

4

Thực sự có tạo thành phần không? Bạn có nhận được rằng đến nay?

Tôi thường viết một lớp wrapper cho CoreService, thực hiện IDisposable và sử dụng các phương pháp sau đây trong nó:

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(); 
    } 
} 
4

Gửi một ví dụ tôi tạo ra thời gian trước đây trong trường hợp đó giúp. ....

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; 
     } 

    } 
} 

Các 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; 
     } 

    } 
}