5

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

3 に答える 3

2

タイプの競合だと思います。その中で:WeekEndingIdはRetrieveDepartmentsRequestの整数であり、RetrieveUsersRequestの小数です。MessageBodyMemberのNameプロパティを使用して、競合を解決します。または、RetrieveUsersRequestでプロパティの名前を変更するだけです。

またはさらに良い:WeekEndingIdは常にintである必要はありませんか?

于 2013-02-28T07:24:32.517 に答える
1

この例外は、MessageContractでMessageHeader属性を使用する場合にも発生する可能性があります。私が発見したのは、特定のServiceContract内のすべてのOperationContractで使用されるすべてのMessageHeaderには、使用されるデータ型の個別の「名前」が含まれている必要があるということです。

基本的に、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 に答える