5

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

我收到以下异常:

可能由 IncludeExceptionDetailInFaults=true 创建的 ExceptionDetail,其值为: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”。我想尝试找到解决此问题的方法,同时仍然为该属性使用相同的名称。

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

检索部门请求:

[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);
4

3 回答 3

2

我相信这是一种类型冲突。其中:WeekEndingId 在 RetrieveDepartmentsRequest 中是一个 int,在 RetrieveUsersRequest 中是一个小数。使用 MessageBodyMember 的 Name 属性来解决冲突。或者只是更改 RetrieveUsersRequest 中的属性名称。

或者更好:WeekEndingId 不应该总是一个 int 吗?

于 2013-02-28T07:24:32.517 回答
1

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

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

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

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

于 2017-04-19T21:34:05.283 回答
0

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

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

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

或者你可以尝试:

[MessageContract(IsWrapped = false)]
于 2013-02-27T23:56:23.840 回答