【问题标题】:Calling web service using javascript error使用 javascript 错误调用 Web 服务
【发布时间】:2010-02-02 14:52:35
【问题描述】:

我尝试使用 json 调用 web 服务,当我调用没有异常参数的 web 服务时,它的工作, 但是当我尝试发送参数时,我得到了一个错误:

这是我的代码:

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:请求格式无效:application/json; charset=utf-8.

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

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

怎么了?

提前致谢。

【问题讨论】:

  • 行 `url = url + "?rnd=" + Math.random();` 是不必要的,POST 请求永远不会被缓存。
  • @Andy E:POST 请求永远不会按标准缓存,我们都知道一些用户代理对标准的重视程度很低。我不会说出任何名字(幸运的是,通常会想到的那个没有受到这个问题的困扰)。
  • @Andrew Moore:我必须说我不知道​​,但我只使用 Chrome 和 IE。仍然在POST 请求将被缓存的情况下,时间戳可以设置在POST 数据中或更合适的if-modified-since 请求标头可以设置。
  • @Andy E:罪魁祸首通常使用 URL 的哈希版本进行缓存。我想到了一些移动浏览器。因此,不幸的是,唯一可行的解​​决方案是 GET 参数。
  • @Andrew Moore:很好,我的立场是正确的,我不会再对此事多说 :-)

标签: javascript webservice-client


【解决方案1】:

你可以在 javascript 中调用 web 服务,它会返回 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());

    }
}

}

它工作正常:)

【讨论】:

    【解决方案2】:

    据我所知,您的应用程序不能接受 application/json 作为发布数据格式。请改用 application/x-www-form-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; 
    

    另外,正如我在评论中提到的,您可以删除以下行:

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

    POST 请求不会被缓存,并且在 POST 请求中使用 GET 参数通常是不好的做法。

    【讨论】:

      【解决方案3】:

      我已经通过将这些行添加到服务器的 web.config 中来解决类似的问题:

      <handlers>
        <add name="ScriptHandlerFactory" verb="*" path="*.asmx" type="System.Web.Script.Services.ScriptHandlerFactory" />
      </handlers>
      

      查看此页面:http://msdn.microsoft.com/en-us/library/bb763183.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-26
        • 1970-01-01
        • 2016-09-05
        • 2015-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多