WCF WebService с использованием POST.Ошибка пространства имен? - PullRequest
2 голосов
/ 30 ноября 2010

У меня есть служба RESTful с интерфейсом ниже, использующим POST.Когда я пытаюсь перейти по URL службы, я получаю сообщение об ошибке сервера, говорящее о том, что существует конфликт пространства имен, но я не думаю, что это так.Вот сокращенная версия сообщения об ошибке.

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 службы я получаю следующее исключение:

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>

1 Ответ

4 голосов
/ 30 ноября 2010

Удалить имя из атрибута DataContract. Вы используете общий контракт данных, но вы даете ему статическое имя. Это невозможно, поскольку имя контракта для каждого аргумента универсального типа должно быть разным (генерируется автоматически). Вот причина вашего исключения.

Также удалите поведение метаданных конечной точки mex и службы из файла конфигурации, поскольку оно предназначено для службы SOAP, а не для служб REST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...