我试图让一个页面通过jquery与web服务进行通信。
这是jquery:
function Test(item) {
$.ajax({
type: "POST",
url: "WebService.asmx/test",
data: '{' +
'Item:"' + item + '"' +
'}',
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
var data = jQuery.parseJSON(msg);
if (!data.error) {
alert("YES!!");
}
else {
alert("Error" + " " + data.error);
}
},
error: function (msg) {
alert('Get Details Failure: ' + msg);
}
});
};
这是网络服务:
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
using System.Data.SqlClient;
using System.Web.Script.Services;
using System.Web.Script.Serialization;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class WebService : System.Web.Services.WebService {
public WebService () {}
[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public string Test(string Item)
{
JavaScriptSerializer js = new JavaScriptSerializer();
string strJSON = js.Serialize(Item);
return strJSON;
}
}
但我得到了他的错误:
System.InvalidOperationException: Request format is invalid: application/json; charset=utf-8.
at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters()
at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()
为什么???
答案 0 :(得分:1)
data: '{' +
'Item:"' + item + '"' +
'}',
需要:
data: JSON.stringify({Item: item}),
将产生:
'{"Item": "item's value"}'
这是有效的json。您错过了"
Item
<小时/> 另外:
[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public string Test(string Item)
{
JavaScriptSerializer js = new JavaScriptSerializer();
string strJSON = js.Serialize(Item);
return strJSON;
}
应该是:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string Test(string Item)
{
return Item;
}
您无需序列化该字符串。
答案 1 :(得分:0)
您的JSON对我来说看起来不合适。 值和键应该用引号括起来,如下所示:
'{ "Item" : "' + item + '" }'
EDIT;也许与你的web.config有关。查看this persons solution.
答案 2 :(得分:0)
似乎是一个格式错误的JSON字符串。
另外你可能想看看这个免费的库来解析/编写.NET中的JSON!
NewtonSoft's JSON Library for .NET
使用起来非常简单,提供了很多方法,您不必依赖Javascript解析器。
答案 3 :(得分:0)
正如其他答案所述,您有一些JSON问题。
首先,您在网络服务中使用JSONSerializer
作为返回值 - 但如果您只是使用字符串,则没有理由使用JSONSerializer
。我假设你做的不止于此,所以我在底部有一个例子可以模拟你想要做的事情。
其次,您尝试在JavaScript中解析返回值,即使JSONSerializer
将JSON对象包装在另一个对象(“d”)中时也是如此。因此,您希望在JavaScript中反序列化的是msg.d
,而不仅仅是msg
。一旦你这样做,你将获得基础对象文字。
我增强了服务逻辑,只是为了根据发送的内容得到一些不同的结果。但我想如果你适当地处理你的JSON,知道JSONSerializer
将你的对象粘在另一个内,你就会很高兴。
示例强>
的default.htm
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
<script type="text/javascript" src='http://cdnjs.cloudflare.com/ajax/libs/jquery/1.7.1/jquery.min.js'></script>
<script type="text/javascript">
$(document).ready(function () {
Test('stuff');
Test('balh');
});
function Test(item) {
var item = { Item: item };
$.ajax({
type: "POST",
url: "WebService.asmx/Test",
data: JSON.stringify(item),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
var data = JSON.parse(msg.d);
alert(data);
if (!data.error) {
alert("YES!!");
}
else {
alert("Error" + " " + data.error);
}
},
error: function (msg) {
alert('Get Details Failure: ' + msg);
}
});
};
</script>
WebService.asmx.cs
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
using System.Data.SqlClient;
using System.Web.Script.Services;
using System.Web.Script.Serialization;
namespace WebApplication1
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class WebService : System.Web.Services.WebService
{
public WebService() { }
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string Test(string Item)
{
JavaScriptSerializer js = new JavaScriptSerializer();
string strJSON;
if (Item=="stuff")
{
var returnValue = new { Item = "stuff", success = true };
strJSON = js.Serialize(returnValue);
}
else
{
var returnValue = new { Item = "boo", error = true };
strJSON = js.Serialize(returnValue);
}
return strJSON;
}
}
}
答案 4 :(得分:0)
让我描述一下我从你的问题中得到了什么。
您希望使用类似的Web服务方法 public string HelloWorld(string name) 其中name是你从asp页面输入的,有些字符串说Hello Gud Morning XYZ先生返回到asp页面。
您希望使用JSON格式在视图和Web服务之间进行数据交换。
您希望使用JQUERY AJAX来实现要求,
然后我在这里得到答案。
的WebService
<%@ WebService Language="C#" %>
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Collections;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX or JQuery.
[System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService {
[WebMethod]
public string HelloWorld(string name)
{
Utility ut = new Utility(); // some class where you will have your database connection
ArrayList suggestedProblemName = ut.getItems(name); // some method of the class
return ""+suggestedProblemName[0];
}
}