0

少し前に、ASPXのコードビハインドからJSONとXMLを返すようにWebServicesを取得することができました。

今日、私は既存のASMX WebServiceを移行して、XMLではなくJSONを返す必要がありました(これは少し手間をかけて達成されました)。私の問題は、新しいメソッドをテストすることで明らかになりました。

ASMXのコードビハインドでは、XMLの代わりにJSONを返す新しいメソッドを作成しました。このメソッドは、期待されるJSONを返すという点で機能しますが、新しいルーチンは、コードビハインドのすべてのXMLを返すメソッドを壊します(System.NotSupportedException: The type System.Collections.Hashtable is not supported because it implements IDictionary.戻り型がすべてとして定義されているため、すべて予期しない ""をスローしますXmlDocument)。

JSONを返すメソッドをコメントアウトするだけで、XMLを返すメソッドは正常に機能します。JSONを返すメソッドのコメントを外すと、XMLを返すメソッドが再び壊れます。

サポートするドキュメントはどこにも見つかりませんが、この動作により、ASP.Net 2.0では、JSONを返すメソッドをXMLを返すメソッドと同じモジュールに共存させることはできないと思います。

これにより、次のようにサブクラスのメソッドを分離してみました。

<WebService(Namespace:="http://tempura.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ScriptService()> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class MyWebServices
    Inherits System.Web.Services.WebService

    <ScriptService()> _
    Public Class xml
        Inherits System.Web.Services.WebService

        <WebMethod()> _
        <ScriptMethod(ResponseFormat:=ResponseFormat.Xml)> _
        Public Function MethodName As XmlDocument
            ...
        End Function
    End Class

    <ScriptService()> _
    Public Class json
        Inherits System.Web.Services.WebService

        <WebMethod()> _
        <ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _
        Public Function MethodName As Hashtable
            ...
        End Function
    End Class
End Class

次に、次のいずれかの方法でサービスを呼び出すことができるという考えです。

  • ~/MyWebServices.asmx/xml/MethodName
  • ~/MyWebServices.asmx/xml.MethodName
  • ~/MyWebServices.asmx/json/MethodName
  • ~/MyWebServices.asmx/json.MethodName

残念ながら、これは機能せず、404-NotFoundエラーが発生しました。

すべてのJSONを返すメソッドを別のASMXに単純にスローすることもできますが、より良い方法を望んでいます。

したがって、私の質問は次のとおりです。

  • 達成する方法はあり~/MyWebServices.asmx/xml/MethodNameます~/MyWebServices.asmx/json.MethodNameか?仮想パスで関数をリターンタイプで区切るというアイデアが好きです。
  • それができない場合、JSONを返すメソッドをXMLを返すメソッドと同じモジュールに共存させる方法はありますか?
4

2 に答える 2

1

この制限についてあなたが正しいことを知って驚いたが、それは.asmxスクリプトサービスにのみ適用される。ASP.NET 2.0以降では、一般的に、必要なコンテンツタイプの種類(および組み合わせ)を返すことができます。

これらの制限を説明し、ASMX / JSONに関する誤解を明らかにするこの記事を見つけました:http: //encosia.com/asmx-and-json-common-mistakes-and-misconceptions/。関連する抜粋は次のように述べています。

「前に触れたように、これらのScriptServicesは、適切に要求された場合にのみJSONシリアル化された結果を返すという規定があります。そうしないと、属性でマークされたサービスでもJSONではなくXMLが返されます。これが理由の一部であると推測できます。 ASMXサービスがJSONで応答できないという誤解のために。」
于 2012-06-07T21:24:11.943 に答える
0

試みのために@smartcavemanに+1。

これに対する解決策は、別の(そして全体としてはより良いと思う)アプローチでした。XMLDocument(XML)または(JSON)のいずれかを明示的に返す代わりに、HashTable次のようなカスタム戻りオブジェクトを書き出しました。

<WebService(Namespace:="http://tempura.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ScriptService()> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class MyWebServices
    Inherits System.Web.Services.WebService

    <WebMethod()> _
    <ScriptMethod()> _
    Public Function MethodName As CustomReturnObject
        ...
    End Function

End Class

カスタムreturnオブジェクトが実装されていることを確認しIXmlSerializable、Frameworkが呼び出し元に応じてXMLまたはJSONを返すようになりました。

呼び出し元がのを指定した場合contentTypeapplication/xmlXMLが返されます。

呼び出し元がのを指定した場合contentTypeapplication/jsonJSONが返されます。

このアプローチは、Webサービスをリターンタイプごとに整理する必要がなく、作成するWebサービスごとに2つの別々のメソッド(1つはXML、1つはJSON)を維持する必要がないという点で優れていると思います。

少なくとも見てくれてありがとう。

于 2012-06-11T16:38:52.070 に答える