【问题标题】:JSON WebService in ASP.NETASP.NET 中的 JSON Web 服务
【发布时间】:2008-11-28 05:10:24
【问题描述】:

如何创建返回 JSON 格式数据的 ASP.NET Web 服务?

【问题讨论】:

  • 您需要哪些方面的帮助 - 创建 Web 服务,还是使用 JSON 编码?或两者?它们几乎是不同的问题。

标签: asp.net ajax json


【解决方案1】:

最重要的是要了解如何以 JSON 格式表示数据。 请参考http://www.json.org/了解更多信息。

一旦你理解了这一点,那么剩下的部分就很简单了。

请查看以下 URL 以获取相同示例。

http://www.ajaxprojects.com/ajax/tutorialdetails.php?itemid=264 http://code.msdn.microsoft.com/JSONSampleDotNet
http://www.phdcc.com/xml2json.htm

我为此推荐 Jquery 库。一个轻量级的丰富库,支持调用web服务,处理json数据格式输出等。

有关更多信息,请访问 www.jquery.com。

【讨论】:

    【解决方案2】:

    .NET 3.5 已内置支持。对于 .NET 2.0,需要额外的库。我使用了 Jayrock 库。

    我最近交付了一个在浏览器上使用纯 Javascript 的应用程序(即使用 AJAX 技术,但不使用 Microsoft AJAX 或 Scriptaculous 等),它在后端与 Microsoft 网络服务相结合。当我开始写这篇文章时,我是 .NET 世界的新手,并且对那里的所有框架感到不知所措!所以我有一种使用小型库而不是大型框架的冲动。

    在 javascript 应用程序中,我调用这样的 Web 服务。它直接读取 Web 服务的输出,去掉非 JSON 部分,然后使用https://github.com/douglascrockford/JSON-js/blob/master/json2.js 解析 JSON 对象。

    这不是标准方法,但很容易理解,并且可能对您有价值,无论是使用还是只是学习 Web 服务和 JSON。

    // enclosing html page has loaded this:
    <script type="text/javascript" src="res/js/json2.js"></script> 
    
    // Invoke like this:
    // var validObj = = callAnyWebservice("WebServiceName", "");
    //    if (!validObj || validObj.returnCode != 0) {
    //      alert("Document number " + DocId + " is not in the vPage database. Cannot continue.");
    //      DocId = null;
    //    }
    
    
    function callAnyWebservice(webserviceName, params) {
      var base = document.location.href;
      if (base.indexOf(globals.testingIPaddr) < 0) return;
    
      gDocPagesObject=null;
    
      var http = new XMLHttpRequest();
      var url = "http://mywebserver/appdir/WebServices.asmx/" + webserviceName;
    
      //alert(url + " " + params);
    
      http.open("POST", url, false);
      http.setRequestHeader("Host", globals.testingIPaddr);
      http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      http.setRequestHeader("Content-Length", params.length);
      // http.setRequestHeader("Connection", "close");
      //Call a function when the state changes.
      http.onreadystatechange = function() { 
        if (http.readyState == 4 ) {
          if (http.status == 200) {
    
            var JSON_text = http.responseText;
    
            var firstCurlyQuote = JSON_text.indexOf('{');
            JSON_text = JSON_text.substr(firstCurlyQuote);
            var lastCurlyQuote = JSON_text.lastIndexOf('}') + 1;
            JSON_text = JSON_text.substr(0, lastCurlyQuote);   
    
            if (JSON_text!="")
            {
                //if (DEBUG)
                //  alert(url+" " +JSON_text);
                gDocPagesObject = eval("(" + JSON_text + ")");
            }
          }
          else if (http.readyState == 4)
            {alert(http.readyState + " " + http.status + " " + http.responseText)}
        }
      }
    
      http.send(params);
    
      if (gDocPagesObject != null) {
        //alert(gDocPagesObject.returnCode + " " + gDocPagesObject.returnString);
        return gDocPagesObject;
      }
      else
        return "web service unavailable: data not ready"; 
    }
    

    【讨论】:

      【解决方案3】:

      在我们的项目中,要求如下——服务器上的 ASP.NET 2.0,浏览器上的纯 Javascript(没有 JQuery 库或 .NET AJAX)

      在这种情况下,在服务器端,只需将 web 方法标记为使用 JSON。请注意,输入和输出参数都是 json 格式的

      [WebMethod]
      [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
      public String Foo(String p1, String p2)
      {
          return "Result: p1= " + p1 + " p2= " + p2;
      }
      

      在 javascript 方面,使用常规 XmlHttpRequest 对象,确保将输入参数格式化为 JSON,并对输出参数执行“评估”。

      var httpobj = getXmlHttpRequestObject();
      
      //Gets the browser specific XmlHttpRequest Object
      function getXmlHttpRequestObject() 
      {
          if (window.XMLHttpRequest) 
             return new XMLHttpRequest();
          else if(window.ActiveXObject) 
             return new ActiveXObject("Microsoft.XMLHTTP");
      } 
      
      
      CallService()
      {
          //Set the JSON formatted input params
          var param = "{'p1' : 'value1', 'p2' : 'value2'}";
      
          //Send it to webservice
          if(httpobj.readyState == 4 || httpobj.readyState == 0)
          {
              httpobj.open("POST", 'service.asmx/' + 'Foo', true);
              //Mark the request as JSON and UTF-8
              httpobj.setRequestHeader('Content-Type','application/json; charset=utf-8');
              httpobj.onreadystatechange = OnSuccess;
              httpobj.send(param);
          }
      
      }
      
      OnSuccess()
      {
         if (httpobj.readyState == 4) 
         {
            //Retrieve the JSON return param
            var response = eval("(" + httpobj.responseText + ")");
         }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多