我遵循的模式包含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);
答案 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)]