1

現在、SOAP WCF サービスの 1 つで非常に奇妙な問題が発生しています。問題は、Visual Studio の ServiceReference-Tool がいくつかのメソッドの引数を変更することです。

例えば:

これが私のインターフェイス定義の場合 (抜粋):

namespace ****.PrimeTime.PrimeTime
{
    [ServiceContract]
    public interface IPrimeTimeWS
    {
        [...]
        [OperationContract]
        ****.PrimeTime.BusinessObjects.CostDataset ReadCost(****.PrimeTime.BusinessObjects.SearchCostDataset searchDataset, ****.Framework.SharedComponents.Paging pagingInfo);
        [OperationContract]
        ****.PrimeTime.BusinessObjects.CostDataset WriteCost(****.PrimeTime.BusinessObjects.CostDataset data, bool modifyRowState);
    }
}

そして、これは私のサービス定義です(抜粋):

namespace ****.PrimeTime.PrimeTime
{
    public class PrimeTimeWS : IPrimeTimeWS
    {
        [...]
        public ****.PrimeTime.BusinessObjects.CostDataset WriteCost(****.PrimeTime.BusinessObjects.CostDataset data, bool modifyRowState)
        {
            [...]
        }
        public ****.PrimeTime.BusinessObjects.CostDataset ReadCost(****.PrimeTime.BusinessObjects.SearchCostDataset searchDataset, ****.Framework.SharedComponents.Paging pagingInfo)
        {
            [...]
        }
    }
}

wsdl ファイルは正しいです (WriteCost には、CostDataset と bool の 2 つのパラメーターがあります)。

しかし、クライアントにサービス参照を追加すると、次のようになります。

サービス リファレンスの WriteCost ReadCost メソッドは期待どおりに機能します。問題は、すべての (!) Write メソッドで、他のデータセットが TimeDataDataset に置き換えられることです。これは、使用されるデータセットに関係なく、書き込みメソッド以外のメソッドでは発生しません。

私はこの問題に1日近く取り組んでいますが、改善を達成できませんでした。

私はすでに試しました:

  • サービス参照の削除と再作成
  • サービスとクライアントのクリーニングと再構築
  • 空のプロジェクトにサービス参照を追加する - >同じことが起こります
  • CostDataset は、TimeDataDataset またはその他のデータセットと (構造的に) 違いはありません。
  • パラメーターが正しくなるように Reference.cs を手動で変更すると、それは機能しますが、サービス参照を更新しない限り、変更が上書きされます。

何か案は?さらにソース コードが必要な場合は、提供できますが、ここにすべてのコードを入れたくなかったのは、少し多すぎるためです...

4

2 に答える 2

2

通常、このようなことが発生した場合、使用されている dll は、使用されていると思われるものではありません。

例えば:

  • WSDL は IIS サイトから読み取られていますか? どのディレクトリを指している Web サイトの構成を確認しますか?
  • bin ディレクトリのバージョンの代わりに使用されている GAC のコピーはありますか?
  • dll のビルドを停止するコードにエラーがあるため、古いものが使用されていますか?

これが発生したら、JustDecompile で dll を開き、その内容を確認します。

于 2013-09-19T18:19:03.780 に答える
1

タイプミスの助けを借りて、「偶然に」問題を解決しました。

この問題の原因は、OperationContract でパラメーター名を再利用できないことです。

このコード:

 [OperationContract]
        ****.PrimeTime.BusinessObjects.ProjectDataset WriteProject(****.PrimeTime.BusinessObjects.ProjectDataset data, bool modifyRowState);
        [OperationContract]
        ****.PrimeTime.BusinessObjects.CompanyDataset WriteCompany(****.PrimeTime.BusinessObjects.CompanyDataset data, bool modifyRowState);

「データ」パラメーターが別の型で再利用されているため、機能しません。機能させるために、インターフェイスのすべてのパラメーターの名前を変更して、名前の前にメソッド名が次のように付くようにしました。

 [OperationContract]
        ****.PrimeTime.BusinessObjects.ProjectDataset WriteProject(****.PrimeTime.BusinessObjects.ProjectDataset WriteProject_data, bool WriteProject_modifyRowState);
        [OperationContract]
        ****.PrimeTime.BusinessObjects.CompanyDataset WriteCompany(****.PrimeTime.BusinessObjects.CompanyDataset WriteCompany_data, bool WriteCompany_modifyRowState);

解決しました。

于 2013-09-22T18:24:44.297 に答える