[英]WCF WebService using POST. Namespace error?
我在下面的界面中使用POST提供了RESTful服務。 當我嘗試轉到服務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)
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>
從DataContract屬性中刪除名稱。 您正在使用通用數據協定,但您為其指定了靜態名稱。 這是不可能的,因為每個泛型類型參數的合同名稱必須不同(自動生成)。 那就是你例外的原因。
還從配置文件中刪除mex端點和服務元數據行為,因為它是針對SOAP服務而不是REST服務的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.