2

私のasmxファイルには、

        [WebMethod]
        [ScriptMethod]
        public void Method(IDictionary<string, CustomClass> objectOfCustomClass)
        {
           //do stuff
        }

カスタムクラスは次のように定義されます。

public class CustomClass
    {
        public string Prop1 { get; set; }
        public string Prop2 { get; set; }       
    }

すべてがうまくいき、WebサービスはJqueryajaxメソッドから正常に消費されています。最近、 http://localhost/Services.asmx/Methodなどの直接URLからテストしてアクセスすることにしました。

そして私はこのメッセージを受け取ります

「インターフェースSystem.Collections.Generic.IDictionaryをシリアル化できません」

これはオフのようです。何が原因で、正常ですか?私は混乱しています-それは物事を行うためのクリーンな方法のようですが、Microsoftによれば、それは行われるべきではありません、それでもそれはWebサービスに直接アクセスするときだけではありません。何が得られますか?また、一部のMSサイトで、IDictionaryをパラメーターとしてWebサービスに渡すことができないが、正常に機能していることを読みました...それで、実行できるかどうかはわかりませんか?誰かがこれを完全に明確にすることができますか?

4

3 に答える 3

3

残念ながら、はい、これは正常です。表示されているのは、従来のASP.NET WebサービススタックでのXMLシリアル化(XmlSerializer)の制限です。IDictionaryを実装するものはすべて使用できません。

[ScriptMethod]を介してJavaScriptに公開されるサービスは、この制限のない別のシリアライザー(JavaScriptSerializer)を使用します。

JavaScriptからサービスを呼び出すときは、JSONエンドポイント([ScriptMethod]で宣言)を呼び出します。ただし、ブラウザーからテストすると、従来のXMLエンポイント([WebMethod]で宣言)に到達します。

いくつかの回避策があります。たとえば、この質問を参照してください。ただし、AJAXクライアントのみをサポートする必要がある場合は、XMLエンドポイント([WebMethod]属性)を削除するだけで問題を回避できます。

ちなみに、WCFの改良されたシリアライザーは、辞書のシリアル化をサポートしています。

于 2011-02-09T00:25:30.940 に答える
1

ASMX Webサービスは、XmlSerializerを使用してオブジェクトをシリアル化および逆シリアル化しますが、適切なXMLスキーマでディクショナリを表す良い方法はありません。残念ながら、IDictionaryをXmlSerializerでシリアル化できる別のタイプのオブジェクトに変換する以外に、これを回避する良い方法はないと思います。

この記事「.NETFrameworkでのXMLシリアル化」(http://msdn.microsoft.com/en-us/library/ms950721.aspx)からの抜粋:

Q:ハッシュテーブルをシリアル化できないのはなぜですか?

A:XmlSerializerは、IDictionaryインターフェースを実装するクラスを処理できません。これは、一部にはスケジュールの制約によるものであり、一部にはハッシュテーブルにXSD型システムに対応するものがないという事実によるものです。唯一の解決策は、IDictionaryインターフェースを実装しないカスタムハッシュテーブルを実装することです。

于 2011-02-09T00:25:04.390 に答える
0

同じ問題が見つかりましたが、IDictionaryタイプを動的に変更しました。

他のすべては同じように機能します。

于 2020-05-27T22:28:15.840 に答える