2010-02-02 63 views
1

我嘗試使用JSON來調用Web服務調用Web服務,當我打電話給網絡服務沒有例外的參數,它的工作,但 當我嘗試發送參數,香港專業教育學院得到了一個錯誤:使用JavaScript錯誤

這是我的代碼:

function GetSynchronousJSONResponse(url, postData) 
{ 

    var xmlhttp = null; 
    if (window.XMLHttpRequest) 
     xmlhttp = new XMLHttpRequest(); 
    else if (window.ActiveXObject) { 
     if (new ActiveXObject("Microsoft.XMLHTTP")) 
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
     else 
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); 
    } 

    url = url + "?rnd=" + Math.random(); // to be ensure non-cached version 

    xmlhttp.open("POST", url, false); 
    xmlhttp.setRequestHeader("Content-Type", "application/json; charset=utf-8"); 
    xmlhttp.send(postData); 
    var responseText = xmlhttp.responseText; 
    return responseText; 
} 


function Test() 
{ 
    var result = GetSynchronousJSONResponse('http://localhost:1517/Mysite/Myservice.asmx/myProc', '{"MyParam":"' + 'test' + '"}'); 
    result = eval('(' + result + ')'); 
    alert(result.d); 
} 

這是錯誤:

System.InvalidOperationException:請求格式是無效的:應用程序/ JSON的;字符集= UTF-8。

在System.Web.Services.Protocols.HttpServerProtocol.ReadParameters()

在System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest

有什麼不對?

在此先感謝。

+0

該行'url = url +「?rnd =」+ Math.random();'不必要,'POST'請求​​永遠不會被緩存。 –

+0

@Andy E:'POST'請求​​從不緩存**,標準**,我們都知道一些用戶代理對標準的關注度很低。我不會說出任何名字(幸運的是,這個問題通常不會被這個問題困擾)。 –

+0

@Andrew Moore:我必須說我不知道​​任何,但是我再次只使用Chrome和IE。在'POST'請求被緩存的情況下,時間戳可以在'POST'數據中設置,或者可以設置更合適的'if-modified-since'請求頭。 –

回答

1

從我所知道的,你的應用程序不能接受application/json作爲後期數據格式。使用應用程序/ x-WWW窗體-urlencoded而不是和設置您的JSON的請求參數,然後可以使用Request.Params["key"]訪問:

xmlhttp.open("POST", url, false); 
xmlhttp.setRequestHeader(
    "Content-Type", "application/x-www-form-urlencoded; charset=utf-8" 
); 
xmlhttp.send("json="+encodeURIComponent(postData)); 
var responseText = xmlhttp.responseText; 
return responseText; 

此外,正如我在我的評論中提到,你可以刪除以下line:

url = url + "?rnd=" + Math.random(); // to be ensure non-cached version 

POST請求沒有被緩存,並且在POST請求中使用GET參數通常是不好的做法。

2

U可以調用Web服務的JavaScript將返回JSON :)

$.ajax({ 
    type: "POST", 
    url: '<%=ResolveUrl("~/DesktopModules/TECH_WEBRTC/Service/Users.asmx/Getprovider")%>', 
    data: JSON.stringify({id:'a'}), 
      contentType: "application/json; charset=utf-8", 

      dataType: "json", 
      processData: false, 
      success: (function (providerlist) { 


       var obj = jQuery.parseJSON(providerlist.d); 
       providers(obj); 
      } 
      ), 
      error: function (data) 
      { 

      } 
}); 




namespace TECH_WEBRTC.Service 
{ 
/// <summary> 
/// Summary description for Users 
/// </summary> 
[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.ComponentModel.ToolboxItem(false)] 

// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
[System.Web.Script.Services.ScriptService] 
public class Users : System.Web.Services.WebService 
{ 



    [WebMethod] 
    //[ScriptMethod(ResponseFormat = ResponseFormat.Json)]//Specify return format. 
    public string Getprovider(string id) 
    { 

     List<Comman1> obj = new List<Comman1>(); 
     JavaScriptSerializer js = new JavaScriptSerializer(); 

     obj.Add(new Comman1{id="1"}); 
      obj.Add(new Comman1{id="2"}); 
      obj.Add(new Comman1 { id = "2" }); 

      //Context.Response.Write(js.Serialize(obj.ToList())); 

     return js.Serialize(obj.ToList()); 

    } 
} 

}

其優良的工作: )