2012-01-16 5 views
1

Im пытается получить страницу, разговаривая с webservice через jquery.json webservice asp.net 2.0

это 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

Не напрямую связана с вашим вопросом, вы не должны вручную использовать JavaScriptSerializer в ScriptService. ASP.NET уже делает это автоматически: http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/ –

+0

"; charset = utf-8" не требуется в вашем типе контента –

ответ

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

Вам не нужно сериализовать эту строку.

+0

Тем не менее та же ошибка, я боюсь – Beginner

+0

Drop 'UseHttpGet = true' – Joe

+0

попробовал все это по-прежнему тот же результат im fear – Beginner

0

Ваш JSON не подходит для меня. значения и ключи должны быть окружены предложениями, например:

'{ "Item" : "' + item + '" }' 

EDIT; Возможно, что-то связано с вашим web.config. Выезд this persons solution.

+1

Пробовал, что все та же ошибка – Beginner

+0

Обновленный ответ. – Jivings

+0

извините, еще не сделал разницы – Beginner

0

Кажется, это неправильная строка JSON.

Alse вы можете захотеть взглянуть на эту бесплатную библиотеку для разбора/написания JSON в .NET!

NewtonSoft's JSON Library for .NET

Это довольно простой в использовании, предлагает множество методов, и вы не должны полагаться на Javascript анализатор.

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; 
     } 
    } 
} 
0

Позвольте мне описать то, что я получил от ваших вопросов.

  1. Вы хотите иметь метод вебсервиса что-то вроде общественного строки HelloWorld (названия строки) где имя Вашего входа со страницы осины и некоторыми строк поздороваться Gud утро г-н XYZ является возврат на страницу осины.

  2. Вы хотите использовать формат JSON для обмена данными между представлением и веб-сервисом.

  3. Вы хотите использовать JQuery AJAX для выполнения требований,

Тогда я здесь с ответом.

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