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

C# 具有相同返回类型和名称的MessageBodyMembers导致异常-元素已导出,c#,.net,wcf,C#,.net,Wcf,我遵循一种模式,该模式具有用于WCF服务的请求和响应的对象。我有多个具有相同返回类型和名称的请求对象。任何帮助都将不胜感激 我得到以下异常: ExceptionDetails,可能由IncludeExceptionDetailInFaults=true创建,其值为: System.InvalidOperationException:调用WSDL导出扩展时引发异常:System.ServiceModel.Description.DataContractSerializeRopection行为 约定

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

我得到以下异常:

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

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

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

检索部门请求:

[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; }
    }
[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; }
}
[OperationContract]
[FaultContract(typeof(ServiceFault))]
RetrieveDepartmentsResponse RetrieveDepartments(RetrieveDepartmentsRequest request);

[OperationContract]
[FaultContract(typeof(ServiceFault))]
RetrieveUsersResponse RetrieveUsers(RetrieveUsersRequest request);
检索用户请求:

[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; }
    }
[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; }
}
[OperationContract]
[FaultContract(typeof(ServiceFault))]
RetrieveDepartmentsResponse RetrieveDepartments(RetrieveDepartmentsRequest request);

[OperationContract]
[FaultContract(typeof(ServiceFault))]
RetrieveUsersResponse RetrieveUsers(RetrieveUsersRequest request);
iSeries设备:

[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; }
    }
[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; }
}
[OperationContract]
[FaultContract(typeof(ServiceFault))]
RetrieveDepartmentsResponse RetrieveDepartments(RetrieveDepartmentsRequest request);

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

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

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

或者你可以试试:

[MessageContract(IsWrapped = false)]

我相信这是一种类型的冲突。在这方面: WeekEndingId在RetrieveDepartsRequest中是整数,在RetrieveUsersRequest中是小数。 使用MessageBodyMember的Name属性解决冲突。 或 只需在RetrieveUsersRequest中更改属性的名称


或者更好:WeekEndingId不应该始终为int吗?

在MessageContract中使用MessageHeader属性时,也会发生此异常。我发现,在给定ServiceContract内的所有OperationContract中使用的所有MessageHeader都必须包含所用数据类型的不同“名称”

基本上你不能有运营合同: *无效方法a(消息合同a) *无效方法b(消息合同b)

其中,MessageContractA对象的MessageHeader声明名称为“prop1”,MessageContractB对象的MessageHeader声明名称为“prop1”,但数据类型不同


这将破坏与wsdl一起创建Mex元数据的工作。

谢谢您的建议,但我尝试了这两种方法,两种方法都不管用。它应该始终是int,但更改并不能解决问题。我已经使用Name属性为属性指定了唯一的名称,这确实解决了问题,但我们希望对所有请求使用WeekEndingId属性名称。我正在尝试查看在使用相同的属性名称时是否存在修复。谢谢你的建议,真丢人。我曾多次使用相同的属性名称和不同的数据类型。您的邮件正文成员中不能有相同的名称和不同的数据类型。非常感谢!