有没有办法在 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 返回方法共存于同一模块中?

有没有办法在 ASP.Net 2.0 中为 *.asmx 方法映射虚拟目录

我很

惊讶地发现你对这个限制是正确的,但它仅适用于.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/jsoncontentType,则返回 JSON。

我认为这种方法更好,因为我不必按返回类型组织 Web 服务,也不必为我编写的每个 Web 服务维护两个单独的方法(一个 XML,一个 JSON)。

谢谢你至少看。