json webservice asp.net 2.0

时间:2012-01-16 15:50:38

标签: jquery asp.net json

我试图让一个页面通过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()

为什么???

5 个答案:

答案 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)

让我描述一下我从你的问题中得到了什么。

  1. 您希望使用类似的Web服务方法        public string HelloWorld(string name) 其中name是你从asp页面输入的,有些字符串说Hello Gud Morning XYZ先生返回到asp页面。

  2. 您希望使用JSON格式在视图和Web服务之间进行数据交换。

  3. 您希望使用JQUERY AJAX来实现要求,

  4. 然后我在这里得到答案。

    Click her for details

    的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];
                }
            }