【问题标题】:How to force ASMX web service to send JSON data to client on HTTP GET request?如何强制 ASMX Web 服务根据 HTTP GET 请求向客户端发送 JSON 数据?
【发布时间】:2009-07-22 20:41:19
【问题描述】:

我正在尝试在 ASP.NET 3.5 Web 窗体应用程序中将官方 jQuery autocomplete plugin 与 ASMX Web 服务一起使用。如果我理解正确的话,自动完成插件只能使用 HTTP GET 来调用服务(带有两个查询字符串参数:qlimit)。我想出了如何使 Web 服务响应 HTTP GET 调用,但我不知道如何使它返回 JSON 数据(即使当我使用带有 type='POST 的 jQuery $.ajax 调用它时服务返回 JSON 数据',当从自动完成插件调用时,它总是返回 XML)。下面是一些sn-ps的代码:

网络服务:

[ScriptService]
[WebService(Namespace = "http://tempuri.org/")]
public class UserWS: WebService
{
  [WebMethod]
  [ScriptMethod(UseHttpGet=true, ResponseFormat=ResponseFormat.Json)]
  public List<UserDisplayInfo> GetUsers
  (
    string q,
    int limit
  )
  {
    List<UserDisplayInfo>users = GetUsers(q, limit);
    return users.ToList();
  }
}

网页:

$("#test").autocomplete(
  "./Services/UserWS.asmx/GetUsers",
  {
    dataType: 'json',
    type: 'POST', // this setting is ignored
    contentType: 'application/json;charset=utf-8',
    parse: function(data) 
    {
      //...
    }
});

如果这不可能,我想知道什么是更好的选择:

  • 修复自动完成插件以使用 HTTP POST 和 JSON 数据而不是 GET 和查询字符串参数;
  • 使用不同的自动补全插件(我看了几个,但目前官方插件推荐最多,我不确定其他插件是否支持 HTTP POST);
  • ASMX Web 服务的替代方案,例如 WCF Web 服务(我不想使用 WCF,因为 ASMX Web 服务实现起来更简单——没有 web.config 更改、没有合同、没有接口——它给了我我需要的一切);
  • 别的东西。

我在 StackOverflow 上发现了几个类似的问题,但我没有找到适合我的答案。有什么(好的)想法吗?

【问题讨论】:

标签: asp.net jquery webforms autocomplete asmx


【解决方案1】:

自动完成插件需要纯文本格式的结果,而不是 JSON。每个项目都应位于单独的一行:

foo\n
bar\n
baz\n

尝试用通用处理程序 (.ashx) 替换 Web 服务:

public class MyHandler : IHttpHandler
{

  public void ProcessRequest(HttpContext context)
  {
    context.Response.ContentType = "text/plain";
    context.Response.Write("foo\nbar\nbaz");
  }

  public bool IsReusable
  {
    get { return false; }
  }
}

附带说明,如果您希望 ASMX Web 服务返回 JSON,则不能使用 GET。见How to let an ASMX file output JSON

【讨论】:

  • 感谢 Pavel,您是对的:ASMX Web 服务在通过 HTTP GET 调用时无法返回 JSON。所以,我最终使用了 HTTP 处理程序。只有我使用 JSON.NET 库将我的对象集合转换为 JSON 表示法。不得不修改自动完成插件的解析函数来将 JSON 对象转换为 JavaScript 对象,但它似乎工作正常。我没有熨烫所有细节,但我喜欢我所看到的。
猜你喜欢
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多