2010-11-30 24 views
2

J'ai un service RESTful avec l'interface ci-dessous, en utilisant POST. Lorsque j'essaie d'accéder à l'URL du service, j'obtiens une erreur de serveur disant qu'il y a un conflit d'espace de noms, mais je ne pense pas que ce soit le cas. Voici une version raccourcie du message d'erreur.WCS WebService utilisant POST. Erreur d'espace de noms?

System.InvalidOperationException: DataContract for type 'xyz.EntityList`1[zxc]' cannot be added to DataContractSet since type 'xyz.EntityList`1[zxc]' with the same data contract name 'EntityList' in namespace 'Bugg' is already present and the contracts are not equivalent. 

Le reste de l'erreur est indiqué ci-dessous.

namespace MyComp.RestApi.Interfaces 
{ 
    [ServiceContract] 
    public interface ISiteService 
    { 
     [OperationContract] 
     [WebInvoke(Method = "POST", UriTemplate = "Sites/{customerId}/Organizations/", 
      BodyStyle = WebMessageBodyStyle.Bare, 
      RequestFormat = WebMessageFormat.Xml, 
      ResponseFormat = WebMessageFormat.Xml)] 
     EntityList<Organization> GetOrganizationsById(string customerId, string ids); 
    } 
} 

avec cette mise en œuvre de services:

public SiteServiceClass{ 
    public EntityList<Organization> GetOrganizationsById(string customerId, string ids) 
    { 
     Authenticate(); 
     //Div Code 
     var hierarchyCollection = GetHierarchies(customerId); 
     var organizations = new EntityList<Organization>(); 
     foreach (Organization hierarchy in hierarchyCollection) 
     { 
      organizations.EntityArray.Add(hierarchy); 
     } 
     organizations.Total = organizations.EntityArray.Count; 
     return organizations; 
    } 
} 

using System.Collections.Generic; 
using System.Runtime.Serialization; 

namespace MyComp.RestApi.Entities.Utils 
{ 
    /// <summary> 
    /// Generic entity collection with sorting, paging and filtering. 
    /// </summary> 
    /// <typeparam name="T">Entity type.</typeparam> 
    [DataContract(Name="EntityList")] 
    public class EntityList<T> 
    { 
     /// <summary> 
     /// Initializes a new instance of the class. 
     /// </summary> 
     public EntityList() 
     { 
      EntityArray = new List<T>(); 
     } 

     /// <summary> 
     /// Entity list. 
     /// </summary> 
     [DataMember] 
     public List<T> EntityArray { get; set; } 

     /// <summary> 
     /// Totle count. 
     /// </summary> 
     [DataMember] 
     public int Total { get; set; } 

     /// <summary> 
     /// Page number. 
     /// </summary> 
     [DataMember] 
     public int CurrentPageIndex { get; set; } 

     /// <summary> 
     /// Page size. 
     /// </summary> 
     [DataMember] 
     public int PageSize { get; set; } 
    } 
} 

Essayer d'aller à l'URL du service que je reçois cette exception:

An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is: 
System.InvalidOperationException: An exception was thrown in a call to a WSDL export extension: System.ServiceModel.Description.DataContractSerializerOperationBehavior 
contract: http://tempuri.org/:ISiteService ----> System.InvalidOperationException: DataContract for type 'MyComp.RestApi.Entities.Utils.EntityList`1[[MyComp.RestApi.Entities.Organization, MyComp.RestApi.Entities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=85d7c8ed1eb8be9b]]' cannot be added to DataContractSet since type 'MyComp.RestApi.Entities.Utils.EntityList`1[[MyComp.RestApi.Entities.Site, MyComp.RestApi.Entities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=85d7c8ed1eb8be9b]]' with the same data contract name 'EntityList' in namespace 'Bugg' is already present and the contracts are not equivalent. 
    at System.Runtime.Serialization.DataContractSet.Add(XmlQualifiedName name, DataContract dataContract) 
    at System.Runtime.Serialization.DataContractSet.Add(Type type) 
    at System.Runtime.Serialization.XsdDataContractExporter.Export(Type type) 
    at System.ServiceModel.Description.MessageContractExporter.ExportType(Type type, String partName, String operationName, XmlSchemaType& xsdType) 
    at System.ServiceModel.Description.DataContractSerializerMessageContractExporter.ExportBody(Int32 messageIndex, Object state) 
    at System.ServiceModel.Description.MessageContractExporter.ExportMessage(Int32 messageIndex, Object state) 
    at System.ServiceModel.Description.MessageContractExporter.ExportMessageContract() 
    at System.ServiceModel.Description.DataContractSerializerOperationBehavior.System.ServiceModel.Description.IWsdlExportExtension.ExportContract(WsdlExporter exporter, WsdlContractConversionContext contractContext) 
    at System.ServiceModel.Description.WsdlExporter.CallExtension(WsdlContractConversionContext contractContext, IWsdlExportExtension extension) 
    --- End of inner ExceptionDetail stack trace --- 
    at System.ServiceModel.Description.WsdlExporter.CallExtension(WsdlContractConversionContext contractContext, IWsdlExportExtension extension) 
    at System.ServiceModel.Description.WsdlExporter.CallExportContract(WsdlContractConversionContext contractContext) 
    at System.ServiceModel.Description.WsdlExporter.ExportContract(ContractDescription contract) 
    at System.ServiceModel.Description.WsdlExporter.ExportEndpoint(ServiceEndpoint endpoint, XmlQualifiedName wsdlServiceQName) 
    at System.ServiceModel.Description.WsdlExporter.ExportEndpoints(IEnumerable`1 endpoints, XmlQualifiedName wsdlServiceQName) 
    at System.ServiceModel.Description.ServiceMetadataBehavior.MetadataExtensionInitializer.GenerateMetadata() 
    at System.ServiceModel.Description.ServiceMetadataExtension.EnsureInitialized() 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.InitializationData.InitializeFrom(ServiceMetadataExtension extension) 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.GetInitData() 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.TryHandleDocumentationRequest(Message httpGetRequest, String[] queries, Message& replyMessage) 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.ProcessHttpRequest(Message httpGetRequest) 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.Get(Message message) 
    at SyncInvokeGet(Object , Object[] , Object[]) 
    at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) 
    at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) 

Extraits de config web:

<services> 
<service behaviorConfiguration="MyComp.RestApi.Services.SiteServiceBehavior" 
       name="MyComp.RestApi.Services.SiteService"> 
       <endpoint behaviorConfiguration="webHttp" binding="webHttpBinding" 
        contract="MyComp.RestApi.Interfaces.ISiteService" /> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
      </service> 
</services> 
<behaviors> 
      <endpointBehaviors> 
       <behavior name="webHttp"> 
        <webHttp /> 
       </behavior> 
      </endpointBehaviors> 
      <serviceBehaviors> 
<behavior name="MyComp.RestApi.Services.SiteServiceBehavior"> 
        <serviceMetadata httpGetEnabled="true" /> 
        <serviceDebug includeExceptionDetailInFaults="true" /> 
       </behavior> 

</serviceBehaviors> 
</behaviors> 

Répondre

4

Supprimer le nom de DataCont attribut ract. Vous utilisez un contrat de données génériques, mais vous lui donnez un nom statique. Ce n'est pas possible car le nom du contrat pour chaque argument de type générique doit être différent (généré automatiquement). C'est la raison de votre exception.

Supprimez également le comportement mex des points de terminaison et des métadonnées de service de votre fichier de configuration car il s'agit d'un service SOAP et non de services REST.

+0

Merci beaucoup! J'ai passé des heures hier à essayer de comprendre cela. Je suis nouveau à cela. Où voyez-vous que nous utilisons un contrat de données générique? Est-ce que l'attribut '[ServiceContract]' de l'interface ISiteService n'a pas de propriété Name? – Polymorphix

+0

EntityList est un type générique mais vous l'avez utilisé plus d'une fois avec un argument de type generict différent. –

+0

Ah, en ce sens ... Merci encore, Ladislav! – Polymorphix