外部調用mvc的api方法時,如何解決跨域請求問題?


首先,創建一個mvc項目(包含webapi),我們模擬一個場景

1)在項目的Controller 創建一個WeiXinApiController

public class WeiXinApiController : ApiController
    {
        WeiXinApiService service = new WeiXinApiService();

        [System.Web.Http.HttpGet]
        public string GetCultureLevel()
        {
            //獲取文化程度的方法
            AppResult result = service.GetCultureLevel();
            //返回json格式
            return JsonConvert.SerializeObject(result,Newtonsoft.Json.Formatting.Indented);
        }
    }

2) 在項目的Model中創建一個WeixinApiService的業務類

  public class WeiXinApiService
    {
        public dynamic GetCultureLevel() {
            //定義一個key/value的集合
            Dictionary<int, string> dicts = new Dictionary<int, string>();
            dicts[1] = "初中";
            dicts[2] = "高中";
            dicts[3] = "中專";
            dicts[4] = "大專";
            dicts[5] = "本科";
            dicts[6] = "碩士";
            dicts[7] = "博士";
            //聲明返回的數據類
            AppResult result = new AppResult();
            try
            {
                dynamic list = dicts;
                if (list.Count > 0)
                {
                    result.Success = true;
                    result.Message = "返回成功";
                    result.Data = list;
                }
                else
                {
                    result.Success = false;
                    result.Message = "返回失敗";
                }
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Message = ex.Message;
            }
            return result;
        }
    }

3)在項目新建一個文件夾Common,創建一個AppResult類(返回數據類)

 public class AppResult
    {
        public AppResult()
        {
        }
        public AppResult(bool bo, string msg)
        {
            _Success = bo;
            Message = msg;
        }
        private bool _Success = false;

        /// <summary>
        /// 調用是否成功
        /// </summary>
        public bool Success
        {
            get { return _Success; }
            set { _Success = value; }
        }

        /// <summary>
        /// 返回的信息
        /// </summary>
        public string Message { get; set; }

        /// <summary>
        /// 返回數據
        /// </summary>
        public object Data { get; set; }
    }

4)運行起來,用瀏覽器訪問對應api控制器方法,是可以調用返回數據的

注:http://localhost:29303/api/Weixinapi/GetCultureLevel 路徑是我本地項目路徑

 

5)用外部調用這個api方法時,就會出現跨域訪問問題(調用時,保持項目是運行的)

我們用DW測試,引用一個jquery.min.js文件,調用jquery的ajax請求方法進行請求

html頁面

<body> 
  <input type="button" value="調用測試" onClick="Test()"/>  
</body>

js 方法

<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript">
var Test = function(){
      $.ajax({
        type: 'GET',
        url: 'http://localhost:29303/api/Weixinapi/GetCultureLevel',
        asyuc: true,
        jsonp: 'jsoncallback',
        success: function (datalist) {
            //將數據轉化為json格式
            var dt = JSON.parse(datalist);
            //判斷是否返回成功
            if (dt.Success) {         
                console.log(dt);
            }
            else{
                console.log(dt.Message);    
           }
         }
          });
    }
</script>

出現跨域問題

那么如何解決跨域請求的問題呢?我在網上找到解決方法(添加支持跨域請求的屬性)

6)在項目添加文件夾Attributes,新建一個CrossSiteAttribute.cs類

/// <summary>
    /// 控制Api接口是否支持跨域調用
    /// </summary>
    public class CrossSiteAttribute : System.Web.Http.Filters.ActionFilterAttribute
    {
        private const string Origin = "Origin";
        /// <summary>
        /// Access-Control-Allow-Origin是HTML5中定義的一種服務器端返回Response header,用來解決資源(比如字體)的跨域權限問題。
        /// </summary>
        private const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";
        /// <summary>
        ///  originHeaderdefault的值可以使 URL 或 *,如果是 URL 則只會允許來自該 URL 的請求,* 則允許任何域的請求
        /// </summary>
        private const string originHeaderdefault = "*";//"http://192.168.13.7:8002";
        /// <summary>
        /// 該方法允許api支持跨域調用
        /// </summary>
        /// <param name="actionExecutedContext"> 初始化 System.Web.Http.Filters.HttpActionExecutedContext 類的新實例。</param>
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            actionExecutedContext.Response.Headers.Add(AccessControlAllowOrigin, originHeaderdefault);
        }
    }

7)在原先api控制器的方法前加上這個屬性

 public class WeiXinApiController : ApiController
    {
        WeiXinApiService service = new WeiXinApiService();

        [System.Web.Http.HttpGet]
        [CrossSiteAttribute]
        public string GetCultureLevel()
        {
            //獲取文化程度的方法
            AppResult result = service.GetCultureLevel();
            //返回json格式
            return JsonConvert.SerializeObject(result,Newtonsoft.Json.Formatting.Indented);
        }
    }

8)再次運行項目,用外部調用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM