前言
首先我们来了解一下WCF Rest吧。
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服务的两种方式。看起来很是很简单的, 我也只是很简单的实现了调用,当然需要优化的地方还是很多的。