这两天在用AngularJS配合WebAPi做项目开发,因为是分布在两个项目上面的,所以首先要解决的就是跨域问题,之前有写过一篇用AngularJS处理跨域的问题,对应的后台没有写出来,今天在这里补充一下后台的内容。
附上AngularJS的解决方案
下面我会列出WebApi的跨域解决方案已经所遇到的一些坑
public class JsonCallbackAttribute : ActionFilterAttribute
{
private const string CallbackQueryParameter = "callback";
public override void OnActionExecuted(HttpActionExecutedContext context)
{
var callback = string.Empty;
if (IsJsonp(out callback))
{
var jsonBuilder = new StringBuilder(callback);
jsonBuilder.AppendFormat("({0})", context.Response.Content.ReadAsStringAsync().Result);
context.Response.Content = new StringContent(jsonBuilder.ToString());
}
base.OnActionExecuted(context);
}
private bool IsJsonp(out string callback)
{
callback = HttpContext.Current.Request.QueryString[CallbackQueryParameter];
return !string.IsNullOrEmpty(callback);
}
}
在你的mvc项目里面新建一个类,类名自个随便定义啦!
用过mvc的人应该知道,继承ActionFilterAttribute方法的作用,这里不多做解释了。
其实这段代码已经帮你解决了跨域的问题,但是这段代码需要执行才会有作用,这里就需要对这个方法做一些配置才行。
config.Filters.Add(new JsonCallbackAttribute());
走到这里的时候,问题就来了,有的人虽然配置过了,但是运行起来一直报错,提示还有接口没有实现
或者没有报错,但是进不了这个方法,这个问题当时我也郁闷了很久,其实很简单
我们这个项目是一个WebApi的项目,在针对接口的配置,我们需要配置的地方不同
需要在WebApiConfig里面进行配置才会正确,相信很多人遇到过这个坑,在这里跟大家说一下。
还有一个问题大家也需要注意一下,一般项目不会只有一个配置,这里大家需要注意一下先后顺序的问题
jsonBuilder.AppendFormat("({0})", context.Response.Content.ReadAsStringAsync().Result);
不然这里的代码可能会出错哦,错误提示我忘了,好像是有什么没有关闭啥的,如果有知道这个错误原理的朋友给我留个言,谢谢!
<h2>另外祝大家2017新年快乐!万事如意