少し前に、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を返すメソッドと同じモジュールに共存させる方法はありますか?