2012-03-29 4 views
5

Viene visualizzato un errore "stato anomalo" quando si utilizza il servizio principale in SDL Tridion 2011 SP1. Cosa c'è di sbagliato in quanto segue?Errore di stato in errore durante la creazione del componente con il servizio principale

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

    } 
    } 
} 

“presso System.ServiceModel.Channels.CommunicationObject.Close (TimeSpan timeout) a System.ServiceModel.Channels.ServiceChannelFactory.OnClose (TimeSpan timeout) a System.ServiceModel.Channels.ServiceChannelFactory.TypedServiceChannelFactory`1 .OnClose (TimeSpan timeout) su System.ServiceModel.Channels.CommunicationObject.Close (timeout TimeSpan) su System.ServiceModel.ChannelFactory.OnClose (timeout TimeSpan) su System.ServiceModel.Channels.CommunicationObject.Close (timeout TimeSpan) su System.ServiceModel .ChannelFactory.System.IDisposable.Dispose() su coreservice1._Default.Page_Load (Object mittente, EventArgs e) in D: \ SampleProjects_Tridion \ test \ coreservice1 \ coreservice1 \ coreservice.aspx.cs: line 73exception is The communicatio n oggetto, System.ServiceModel.Channels.ServiceChannel, non può essere utilizzato per la comunicazione perché è in stato di errore. “

+0

"L'oggetto di comunicazione, System.ServiceModel.Channels.ServiceChannel, non può essere utilizzato per la comunicazione perché è in stato di errore." Ciò significa che si è verificato un errore durante l'esecuzione del codice e non l'hai gestito correttamente. Puoi condividere il codice che hai usato? Vale anche la pena controllare questo post di Peter: http://pkjaer.wordpress.com/2011/11/30/core-service-clients-and-the-using-statement/ –

+0

@NunoLinhares. Ho aggiornato il codice. Plz ci ha pensato. – Patan

+0

Il codice è abbastanza utile. Puoi per favore indicare quale linea è # 73? Il messaggio di errore punta alla riga 73, ma non riesco a mapparlo a questo frammento di codice. –

risposta

5

Penso che questo potrebbe essere a che fare con il modo in cui si istanzia l'oggetto client.

È possibile aggiungere questo come Servizio di riferimento in Visual Studio:

esempio Aggiungi riferimento servizio a http: // {tua tridion url} /webservices/CoreService.svc e dare uno spazio dei nomi di TridionCoreService, allora si può usare in questo modo:

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

In alternativa è possibile utilizzare il metodo che here ti consente di creare un riferimento al servizio principale senza bisogno di un file di configurazione.

4

In realtà crea il componente? Arrivi così lontano?

Io di solito scrivere una classe wrapper per CoreService, implementare IDisposable e utilizzare i seguenti metodi in esso:

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

e

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

L'invio di un esempio che ho creato tempo fa nel caso in cui aiuta. ....

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

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

    } 
} 

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

    } 
}