【问题标题】:ASP.NET - Can a web method's response be SOAP (XML) and JSON?ASP.NET - Web 方法的响应可以是 SOAP (XML) 和 JSON 吗?
【发布时间】:2010-11-11 20:09:51
【问题描述】:

我有一个 ASP.NET Web 应用程序。

它有一个网络服务,有几个网络方法。

所有这些网络方法都基于默认设置。例如:

using System.Web.Services;

namespace WebApplication2
{
    [WebService(Namespace = "http://mydomain.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class WebService1 : WebService
    {
        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }

        [WebMethod]
        public Person GetPersonById(int id)
        {
            Person result = new Person();
            // code...
            return person;
        }
    }
}

响应采用 SOAP (XML) 格式。

我的问题:我可以根据输入参数或标头将响应的格式更改为 JSON 吗?

【问题讨论】:

  • 您是在问如何这样做,还是应该这样做?
  • @Oded - 我在问这在技术上是否可行,如果是这样 - 怎么做。 “应该”部分不在此问题的范围内,因为在生产环境中此服务存在一些限制。
  • 罗恩,如果有任何回答是答案,请将其标记为答案

标签: asp.net web-services json soap format


【解决方案1】:

ASMX Web 服务 的响应类型由单个 Web 方法的 ResponseFormat 属性指定。

例如:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Xml)]
public Person GetPersonById(int id)

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public Person GetPersonById(int id)

所以 AFAIK 的答案是 否 - 您不能同时返回两者(通过一种方法)。

我相信你可以做一些技巧,但这是推荐的方法。

如果您想开始返回这两种类型,您应该转向更 RESTful 的方法,使用 WCF REST、OData 或 ASP.NET MVC。

在这些技术中,被调用者可以指定他们希望的响应类型:

获取:http://api.yourdomain.com/person/1?format=json

获取:http://api.yourdomain.com/person/1?format=xml

注意这两个调用是一个物理资源。

附带说明一下,出于安全原因,“The Goo”here 提到了您的 JSON Web 服务调用应该是 HTTP POST

【讨论】:

    【解决方案2】:

    您应该查看 Windows Communication Foundation (WCF)。使用它,您可以为服务定义多个端点。例如,这些端点中的每一个都可以以不同的格式返回数据。

    REST / SOAP endpoints for a WCF service

    【讨论】:

    • 感谢参考,我会努力实现的。
    【解决方案3】:

    技术上是的,您只需发回 Json 并将响应的 Content-Type 设置为“application/json”。

    【讨论】:

    • 这种技术是否也适用于非字符串返回类型? (见第二种方法)
    • 当您将 JSON 从服务器返回到客户端时,它始终采用字符串的形式。我的意思是 JSON 是 Javascript 对象的字符串表示,也就是说它不是二进制的。但是,简短的回答是否定的,因为在大多数情况下 SOAP 是基于“字符串”的,并且在您的情况下,您的 Person 对象被序列化为字符串,这只是将其序列化为 JSON 字符串的问题。自从我使用 WebServices 已经有一段时间了,但是在 HttpHandler 中,如果我想发回 Person 对象的 JSON,您可以使用 DataContractJsonSerializer 类来完成这项工作。
    • 请注意,SOAP/XML 和 JSON 在许多方面都是相互竞争的概念。因此,在您的基础中,因为您使用的是 Web 服务,所以您无法选择发回 JSON。
    • 因此,例如,如果我在 IHttpHandler 中执行此操作,我可以轻松地在 XML 响应或 JSON 响应或任何其他类型的响应之间切换。 WCF 也是如此,但 WCF 有相当长的学习曲线
    猜你喜欢
    • 2018-07-18
    • 2013-06-23
    • 2013-06-16
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2015-08-15
    • 1970-01-01
    相关资源
    最近更新 更多