WCF WebService using POST. Namespace error?
I have a RESTful service with the interface below, using POST. When I try to go to the service URL I get a server error saying something like there is a namespace conflict, but I don't think that is the case. Here is a shortened version of the error message.
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.
The rest of the error is given below.
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);
}
}
with this service implementation:
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; }
}
}
Trying to go to the service URL I get this 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.De开发者_如何转开发scription.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)
Excerpts from web config:
<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>
Remove the name from DataContract attribute. You are using generic data contract but you are giving it static name. It is not possible because the contract name for each generic type argument has to be different (auto-generated). That is the reason for your exception.
Also remove mex endpoint and service metadata behavior from your configuration file because it is for SOAP service, not for REST services.
精彩评论