有没有办法在 ASP.Net 2.0 中为 *.asmx 方法映射虚拟目录
本文关键字:方法 asmx 映射 虚拟 中为 ASP Net 有没有 | 更新日期: 2023-09-27 18:36:41
前,我设法让WebServices从ASPX的代码隐藏中返回JSON和XML。
今天,我需要迁移现有的 ASMX Web 服务来返回 JSON 而不是 XML(这很容易完成)。我的问题在测试新方法时变得明显。
在 ASMX 的代码隐藏中,我创建了一个返回 JSON 而不是 XML 的新方法。该方法有效,因为它返回预期的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-Not Found 错误。
我可以简单地将所有 JSON 返回方法放入不同的 ASMX 中,但我希望有更好的方法。
因此,我的问题是:
- 有没有办法完成
~/MyWebServices.asmx/xml/MethodName
和~/MyWebServices.asmx/json.MethodName
?我喜欢在虚拟路径中按返回类型分隔函数的想法。 - 如果做不到这一点,有没有办法让 JSON 返回方法与 XML 返回方法共存于同一模块中?
惊讶地发现你对这个限制是正确的,但它仅适用于.asmx脚本服务。 通常,您仍然可以使用 2.0+ 返回所需的任何种类(和组合 ASP.NET 内容类型。
我发现这篇文章解释了这些限制并澄清了对ASMX/JSON的误解:http://encosia.com/asmx-and-json-common-mistakes-and-misconceptions/. 相关摘录说:
"正如我之前提到的,一个规定是这些脚本服务只有在正确请求时才返回 JSON 序列化结果。否则,即使是标有该属性的服务也将返回 XML 而不是 JSON。我只能假设这是误解ASMX服务无法使用JSON响应的部分原因。
+1 表示@smartcaveman尝试。
对此的解决方案是一种不同的(我认为总体上更好)的方法。我没有显式返回XMLDocument
(XML)或HashTable
(JSON),而是写出一个自定义返回对象,如下所示:
<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
我确保自定义返回对象实现IXmlSerializable
,现在框架根据调用方返回 XML 或 JSON。
如果调用方指定contentType
application/xml
,则返回 XML。
如果调用方指定 application/json
的contentType
,则返回 JSON。
我认为这种方法更好,因为我不必按返回类型组织 Web 服务,也不必为我编写的每个 Web 服务维护两个单独的方法(一个 XML,一个 JSON)。
谢谢你至少看。