最近在公司任务比较少,闲来无事就研究了一下 ASP.NET MVC+vue+axios
与ASP.NET WebAPI+vue+axios
实现网站开发,因为公司一直在使用ASP.NET MVC
做电子政务开发,很是麻烦;自己想着有机会重构电子政务系统(想想就行~~~)使得前后端分离。(其实也没写上什么内容主要写了怎么实现通过axios调用两种框架的方法)
ASP.NET MVC+vue+axios
实现至于ASP.NET MVC
以及vue与axios技术的使用,我在这里就不再描述了,我主要写一下怎么通过axios调用ASP.NET MVC
中控制器方法。
[HttpPost]
public ActionResult GetYDBPModel(string a)
{
return Json('result'+a);
}
created:function(){
axios.post('http://localhost:32845/NBGG/GetYDBPModel',{
a:'cons'
})
// 请求成功
.then(response=>{
console.log(response);
})
// 请求失败
.catch(error=>{
alert("网络错误,不能访问");
})
}
}
第三步:就是运行我们的项目vue项目:npm run dev ,会发现报错了(当然不是这么简单!):
错误如下:
No ‘Access-Control-Allow-Origin’ header is present on the requested resource.’
这个是跨域访问出现错误,下面就是解决方法:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Methods" value="OPTIONS,POST,GET"/>
<add name="Access-Control-Allow-Headers" value="x-requested-with,content-type"/>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
这里主要是加了 Access-Control-Allow-Origin 这个 Header, 他是W3C标准里用来检查该跨域请求是否可以被通过。 (Access Control Check)
主要就可以实现了。
ASP.NET WebAPI
+vue+axios实现同样这里我也不再详细写WebAPI的详细使用。主要还是怎么实现:
No 'Access-Control-Allow-Origin' header is present on the requested resource.'
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http.Filters;
namespace webAPI.Models
{
public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Response != null)
actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");
base.OnActionExecuted(actionExecutedContext);
}
}
}
[AllowCrossSiteJson]
public class apiController : ApiController
{
Product[] products = new Product[]
{
new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },
new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },
new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }
};
public IEnumerable<Product> Get()
{
return products;
}
public IHttpActionResult Get(int id)
{
var product = products.FirstOrDefault((p) => p.Id == id);
if (product == null)
{
return NotFound();
}
return Ok(product);
}
}
public class apiController : ApiController
{
Product[] products = new Product[]
{
new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },
new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },
new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }
};
public IEnumerable<Product> Get()
{
return products;
}
[AllowCrossSiteJson]
public IHttpActionResult Get(int id)
{
var product = products.FirstOrDefault((p) => p.Id == id);
if (product == null)
{
return NotFound();
}
return Ok(product);
}
}
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务
//将请求的结果设置为json格式
//config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
// Web API 路由
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
created:function(){
axios.get('http://localhost:34003/api/api')
// 请求成功
.then(response=>{
console.log(response);
})
// 请求失败
.catch(error=>{
alert("网络错误,不能访问");
})
}
}
大功告成!