MessageBodyMembers具有相同的返回类型和名称导致异常 - 元素已导出

时间:2013-02-27 19:25:14

标签: c# .net wcf

我遵循的模式包含WCF服务的请求和响应的对象。我有多个请求对象具有相同的返回类型和名称。任何帮助将不胜感激。

我遇到以下异常:

  

ExceptionDetail,可能由IncludeExceptionDetailInFaults = true创建,其值为:   System.InvalidOperationException:在对WSDL导出扩展的调用中抛出异常:System.ServiceModel.Description.DataContractSerializerOperationBehavior    合同:http://tempuri.org/:IService ----> System.InvalidOperationException:Service.ServiceContract.IService.RetrieveUsers操作引用已从Service.ServiceContract.IService.RetrieveDepartments操作导出的消息元素[http://tempuri.org/:WeekEndingId]。您可以通过更改方法名称或使用OperationContractAttribute的Name属性来更改其中一个操作的名称。或者,您可以使用MessageContract编程模型更详细地控制元素名称。

编辑:我在属性上使用了Name属性为它们指定了唯一的名称,这确实解决了问题,但我们需要为所有请求使用名称“WeekEndingId”。我想尝试找到一个解决方案,同时仍然使用相同的名称属性。

下面列出了导致问题的类:

RetrieveDepartmentsRequest:

[MessageContract(WrapperName = "RetrieveDepartmentsRequest", WrapperNamespace = "http://Service.V1")]
    public class RetrieveDepartmentsRequest
    {
        [MessageBodyMember(Order = 0)]
        public int WeekEndingId { get; set; }

        [MessageBodyMember(Order = 1)]
        public string UserId { get; set; }

        [MessageBodyMember(Order = 2)]
        public string MachineName { get; set; }
    }

RetrieveUsersRequest:

[MessageContract(WrapperName = "RetrieveUsersRequest", WrapperNamespace = "http://Service.V1")]
public class RetrieveUsersRequest
{
    [MessageBodyMember(Order = 0)]
    public int WeekEndingId { get; set; }

    [MessageBodyMember(Order = 1)]
    public string UserId { get; set; }

    [MessageBodyMember(Order = 2)]
    public string MachineName { get; set; }
}

IService:

[OperationContract]
[FaultContract(typeof(ServiceFault))]
RetrieveDepartmentsResponse RetrieveDepartments(RetrieveDepartmentsRequest request);

[OperationContract]
[FaultContract(typeof(ServiceFault))]
RetrieveUsersResponse RetrieveUsers(RetrieveUsersRequest request);

3 个答案:

答案 0 :(得分:2)

我认为这是一种类型冲突。在那里面: WeekEndingId是RetrieveDepartmentsRequest中的int和RetrieveUsersRequest中的小数。 使用MessageBodyMember的Name属性来解决冲突。 要么 只需在RetrieveUsersRequest中更改属性的名称。

OR BETTER尚未:WeekEndingId永远不应该是int?

答案 1 :(得分:1)

在MessageContract中使用MessageHeader属性时也会发生此异常。我发现在给定ServiceContract中所有OperationContracts中使用的所有MessageHeader都必须包含一个不同的" Name"对于使用的数据类型。

基本上你不能拥有OperationContracts:  * void MethodA(MessageContractA a)  * void MethodB(MessageContractB b)

其中MessageContractA对象具有使用名称" prop1"声明的MessageHeader;并且MessageContractB对象具有使用相同的" prop1"声明的MessageHeader;名称,但不同的数据类型。

这与wsdl一起破坏了Mex元数据的创建。

答案 2 :(得分:0)

我相信您看到的问题是因为WrapperNamespace对于两个对象都是相同的。我想你想做的是:

[MessageContract(WrapperNamespace = "USEFUL_NAMESPACE_HERE.RetrieveDepartmentsRequest")]

[MessageContract(WrapperNamespace = "USEFUL_NAMESPACE_HERE.RetrieveUsersRequest")]

或者您可以尝试:

[MessageContract(IsWrapped = false)]