zoukankan      html  css  js  c++  java
  • MVC项目开发中那些用到的知识点(WCF Rest在MVC项目中的两种调用方式)

    前言

      首先我们来了解一下WCF  Rest吧。

    • Rest是一种设计风格,不是一个标准。
    • Rest通常使用HTTP,URI,XML,HTML等流行的协议和标准。
    • Rest是从资源的角度来观察网络的,而资源是由URI来指定的。
    • Rest对资源的操作类型通常包括:获取,创建,删除和修改,这四种操作分别对应着HTTP协议请求的GET,POST,DELETE和PUT方法。
    • 资源的表现形式可以为:XML,HTML,JSON的文本。
    • Rest是服务端-客户端结构中的一种应用方法。
    • Rest使用的是HTTP协议,因此是无状态的。

    Rest在Asp.Net Mvc中的使用

       第一步:先来创建一个Asp.Net Mvc3.0的Web项目。

       第二步:创建一个类库,然后添加一个接口和实现。

      接口代码

    namespace WCFLib
    {
        [ServiceContract]
        public interface IRestService
        {
            [WebGet(UriTemplate = "/Test/{Param}/XML", ResponseFormat = WebMessageFormat.Xml)]
            string Test(string Param);
        }
    }
    

      接口实现

    namespace WCFLib
    {
        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
        [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
        public class RestService:IRestService
        {
            public string Test(string Param)
            {
                switch (Param)
                { 
                    case"1":
                        return "Hello WCF Rest!";
                    case"2":
                        return "Hello Asp.Net Mvc3.0 WCF Rest!";
                    default:
                        return Param;
                }
            }
        }
    }
    

     接口的实现还添加[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

     

    当然还需要在Web.config中进行配置

      <system.serviceModel>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
      </system.serviceModel>
    

    第三步:在Global.asax.cs中添加Rest路由

      先修改原路由代码

            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    "Default", // 路由名称
                    "{controller}/{action}/{id}", // 带有参数的 URL
                    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // 参数默认值
                    new { controller = @"^\b(?!(RestTest))\w*\b$" }  ///此处采用参数constraints,针对Controller进行正则匹配,如果Controller中含有GetRegSourceData的字符串,则过滤掉不执行此路由
                );
    
            }
    

      主要是对Rest进行过滤。

      然后添加针对Rest的路由

    routes.Add(new ServiceRoute("RestTest",new WebServiceHostFactory(),typeof(RestService)));
    

      运行Web项目

     看这三个结果,正好与服务实现相对应。

            public string Test(string Param)
            {
                switch (Param)
                { 
                    case"1":
                        return "Hello WCF Rest!";
                    case"2":
                        return "Hello Asp.Net Mvc3.0 WCF Rest!";
                    default:
                        return Param;
                }
            }
    

    在Mvc控制器中来调用Rest服务的实现

            public ActionResult About()
            {
                string StrUri = "http://" + this.Request.Url.Authority + "/RestTest/" + "Test/" + "1" + "/XML";
                HttpWebRequest _request = (HttpWebRequest)WebRequest.Create(StrUri);
                HttpWebResponse _response = (HttpWebResponse)_request.GetResponse();
                StreamReader _reader = new StreamReader(_response.GetResponseStream(), Encoding.UTF8);
                string _returnXML = _reader.ReadToEnd();
                _reader.Close();
                _response.Close();
                string GetResult = GetMetaByName("string", _returnXML);
                return View("About",null,GetResult);
            }
    
            public static string GetMetaByName(string _name, string _meta)
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(string.Format("<XmlText>{0}</XmlText>", _meta));
    
                XmlNodeList elemList = doc.GetElementsByTagName(_name);
                if (elemList.Count > 0)
                {
                    return elemList[0].InnerXml;
                }
                else
                {
                    return "";
                }
            }

      

      这样GetResult就是我们想要获取的值。

    通过JavaScript来调用Rest服务

    <script type="text/javascript">
        window.onload = function () {
            var _xml = GetRestXML();
            var XmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            XmlDoc.async = "false"; XmlDoc.loadXML("<XmlData>" + _xml.xml + "</XmlData>");
            var ArrTableNode = XmlDoc.getElementsByTagName("string");
            alert(ArrTableNode[0].text);
        }
    
        function GetRestXML() {
            if (window.XMLHttpRequest) {
                xmlhttp = new XMLHttpRequest();
            }
            else {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            //岗位id要从url取
            xmlhttp.open("GET", "../RestTest/Test/2/XML", false);
            xmlhttp.send();
            return xmlhttp.responseXML;
        }
    </script>
    

      我们通过GetRestXML()来调用Rest服务获取数据,返回XML,然后通过Microsoft.XMLDOM来获取XMl节点数据。我将Js函数放在Index视图的Window.onload事件中,就是在主页面加载完毕后执行。

    效果如下。

    总结

      以上就是asp.net mvc 中如何调用Rest服务的两种方式。看起来很是很简单的, 我也只是很简单的实现了调用,当然需要优化的地方还是很多的。

         示例代码下载地址 https://files.cnblogs.com/aehyok/WCFREST.rar

  • 相关阅读:
    虚函数&纯虚函数&抽象类&虚继承
    指针的各式定义
    开源站点
    WCF、Net remoting、Web service概念及区别
    asp.net 分布式应用开发
    C++多重继承二义性解决
    ATL7窗口类详细剖析
    Code review
    GitHub 上100个最受欢迎的Java基础类库
    JAVA基本类库介绍
  • 原文地址:https://www.cnblogs.com/aehyok/p/3023045.html
Copyright © 2011-2022 走看看