使用POST的WCF WebService。命名空间错误?

问题描述:

我有一个使用POST的下面的界面RESTful服务。 当我尝试去服务URL时,我得到一个服务器错误,说有类似的命名空间冲突,但我不认为是这样。以下是错误消息的简短版本。使用POST的WCF WebService。命名空间错误?

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. 

其余的错误在下面给出。

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

这个服务实现:

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

试图去服务URL我得到这个异常:

从web配置
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) 

摘录:

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

从DataCont中删除名称ract属性。您正在使用通用数据合同,但您要为其指定静态名称。这是不可能的,因为每个泛型类型参数的合约名称必须不同(自动生成)。这是你例外的原因。

也从您的配置文件中删除mex端点和服务元数据行为,因为它用于SOAP服务,而不是用于REST服务。

+0

非常感谢!我昨天花了几个小时试图弄清楚这一点。我对此很陌生。你在哪里看到我们正在使用通用数据合同?是否ISiteService接口上的[ServiceContract]属性没有设置Name属性? – Polymorphix 2010-11-30 09:57:03