GSe*_*erg 6 jquery web-services .net-3.5
我刚刚花了六个小时试图把这个直接放在我脑海里,但我还没有成功.
我的本地机器上有一个HelloWorld .NET 3.5 Web服务.根据需要进行设置.
该服务返回一个List自定义结构.  
我正在尝试使用jQuery 1.4.4来使用它.
当我尝试执行文档所说的内容时,我总是从服务中获取XML响应,该响应要么导致parseerrorjQuery ,要么作为哑字符串传递给success函数.也就是说,然而我结合dataType和accepts(其中,根据该文件,控制如何接收数据的处理),我得到一个XML回来.
但是,当我从文档中做一些逻辑上没有的事情时,我成功地获取了我的对象数组.也就是说,当我忽略dataType和accepts,并设置contentType: "application/json; charset=utf-8"相反,它工作正常.但是contentType,根据文档,控制发送到服务器的数据,而不是接收.
$.ajax(
  {
  type: "GET",
  url: "http://localhost:52624/Service1.asmx/HelloWorld",
  dataType: "json",
  //accepts can be anything, or it can be missing, doesn't matter, only depends on dataType
  success: function(data, textStatus, jqXHR) {...},
  error: function(jqXHR, textStatus, errorThrown) {...}
  }
)
结果:错误处理程序调用,textStatus = parseerror.
$.ajax(
  {
  type: "GET",
  url: "http://localhost:52624/Service1.asmx/HelloWorld",
  dataType: "application/json",
  //accepts can be anything, or it can be missing, doesn't matter, only depends on dataType
  success: function(data, textStatus, jqXHR) {...},
  error: function(jqXHR, textStatus, errorThrown) {...}
  }
)
结果:Web服务返回XML,它作为传递给成功处理程序string.
$.ajax(
  {
  type: "GET",
  url: "http://localhost:52624/Service1.asmx/HelloWorld",
  accepts: "json",  // or "application/json"
  success: function(data, textStatus, jqXHR) {...},
  error: function(jqXHR, textStatus, errorThrown) {...}
  }
)
结果:Web服务返回XML,它被解析并作为传递IXMLDOMDocument2.
$.ajax(
  {
  type: "GET",
  url: "http://localhost:52624/Service1.asmx/HelloWorld",
  contentType: "application/json; charset=utf-8",
  success: function(data, textStatus, jqXHR) {...},
  error: function(jqXHR, textStatus, errorThrown) {...}
  }
)
结果:Web服务返回JSON,它被jQuery部分解析(数字和字符串被解析为对象的属性,但是日期保持为形式"/Date(1303003305724)/").
看来我要亲自回答这个问题了。
\n我并不是说以下内容是绝对真理。相反,这是我发现有效的方法。
首先,我找到了三篇文章,解释得很多:
\n\n简而言之,.NET Web 服务的问题在于您必须以特殊方式调用它们:
\n\nContent-Typeapplication/json; charset=utf-8这是设计使然,也是出于安全原因。
\n后者可能无法避免,您必须提供该内容类型。由于内容类型确实规定了请求中参数的编码方式,因此您必须以 JSON 形式对参数进行编码。
这就是 jQuery 发挥作用的地方。jQuery 会无缘无故地忽略contentType你的参数并将其编码为application/x-www-form-urlencoded. 此时,Web 服务将不喜欢您说“这里是 JSON”并提供表单编码的内容。
在这些文章中,作者建议您使用 jQuery 将 JSON 数据括在另一对引号中,以便将其解释为字符串并且不会被 jQuery 弄乱:
\n\n$.ajax({\n  type: "POST",\n  url: "ServiceName.asmx/WebMethodName",\n  data: "{\'fname\':\'dave\',\'lname\':\'ward\'}",\n  contentType: "application/json; charset=utf-8",\n  dataType: "json",\n  success: function(msg) {...}\n});\n这确实有效。
\n\n另外,如果你没有任何数据,你仍然必须提供一个空的 JSON 对象,{}因为如果你不这样做,jQuery 将不会设置Content-Length,并且没有Content-LengthWeb 服务将再次不喜欢你(更多安全原因)。
然而。
\n自 FW 3.5 起,可以GET与支持 JSON 的 .NET 服务一起使用。此时您可能想知道 JSON 编码的参数如何与 GET 请求保持一致。就是这样。
如果您的 Web 服务没有任何参数,则调用很简单:
\n\n$.ajax(\n  {\n    type: "GET",\n    url: "ServiceName.asmx/WebMethodName",\n    contentType: "application/json; charset=utf-8",\n    dataType: "json",\n    success: function(data, textStatus, jqXHR) {...}\n  }\n);\n而且如果有参数的话,那么调用也简单。您所要做的就是在应该包含它们的参数周围提供额外的引号!这是因为您希望这些引号显示为表单编码请求的一部分。这样,表单编码的请求将看起来有点像 json 编码的请求:
\n\n$.ajax(\n  {\n    type: "GET",\n    url: "ServiceName.asmx/WebMethodName",\n    contentType: "application/json; charset=utf-8",\n    data: {DatePlaced:\'"2011-05-13"\'},\n    dataType: "json",\n    success: function(data, textStatus, jqXHR) {...}\n  }\n);\n此请求将产生类似于以下内容的请求:
\n\n\n\n\nGET /ServiceName.asmx/WebMethodName?DatePlaced="2011-05-13" HTTP/1.1
\n
\n 内容类型:application/json;字符集=utf-8
请注意类似 JSON 的 GET 请求所需的引号,但如果您打算请求 XML,则会导致错误。
\n| 归档时间: | 
 | 
| 查看次数: | 7661 次 | 
| 最近记录: |