Jersey訪問Asp.net MVC5 Web Api 一

       因爲項目須要經過使用客戶提供的DLL來獲取數據,可是沒有Java的接口,DLL動態庫是64位的,項目使用的JDK是32位的(好像32位的JDK只能訪問32位的DLL,可是有沒有其餘的方法,那就不得知了)。開始想用WebService的,可是WebService有點繁瑣,也比較重,最近在瞭解Restful,想來想去用這個來試試,下面來講說開發過程當中遇到的問題和須要注意的地方。javascript

    一,服務端
java

        開發環境:VS2013,.Net Framework 4.5.1,MVC5.2,Nugetajax

    使用VS2013新建一個項目,點擊獲取聯機模板json

    

找到圖片中選中的模板,點擊肯定,使用模板會少一些繁雜的設置c#

項目已經建立完成,把客戶提供的DLL引導項目中,由於DLL只能在64位平臺運行,並且這個動態庫還調用C++編寫的動態庫,C++的動態庫仍是32位的,這個時候須要修改兩個地方,要不會報錯。api

一、右鍵「解決方案」-- 「配置管理器「 將平臺從」Any Cpu「改爲」x64「跨域

二、在菜單中選擇」工具「 -- 」選項「 -- 」項目與解決方案「 -- 」Web項目「將」對網站和項目使用IIS Express的64位版「選中app

接着更新項目中使用的插件,Nuget相似Java中的Maven,使用命令就能夠更行相關插件,很是方便
異步

右鍵項目--」管理Nuget程序包「--」更新「在此處能夠更新相關的程序包,還能夠用命令來更新程序包
ide

準備階段完成,如今進入實際開發,先建立一個控制器,右鍵」Controllers「-- 添加」控制器「,選擇」包含讀/寫操做的控制器「

控制器建立好之後,能夠作如下修改,作個一個簡單的例子,將第一個方法添加兩個參數,並傳回去。若是是建立Bean的話,須要注意變量的首字母必定要小寫,要麼在Jersey轉換的時候得不到值。

public class demoController : ApiController
    {
        // GET api/demo
        public IEnumerable<string> Get(string p1,string p2)
        {
            return new string[] { p1, p2 };
        }

        // GET api/demo/5
        public string Get(int id)
        {
            return "value";
        }

        // POST api/demo
        public void Post([FromBody]string value)
        {
        }

        // PUT api/demo/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/demo/5
        public void Delete(int id)
        {
        }
    }

Asp.net MVC默認沒有提供對異步跨域請求的處理,項目之外訪問數據不會合理的取到,須要稍微修改些東西。

在Models中新建一個類(JsonpFormatter.cs),將向下面的代碼進去。

public class JsonpFormatter : JsonMediaTypeFormatter
    {

        public JsonpFormatter()
        {
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/javascript"));

            JsonpParameterName = "callback";
        }

        /// <summary>
        ///  Name of the query string parameter to look for
        ///  the jsonp function name
        /// </summary>
        public string JsonpParameterName { get; set; }

        /// <summary>
        /// Captured name of the Jsonp function that the JSON call
        /// is wrapped in. Set in GetPerRequestFormatter Instance
        /// </summary>
        private string JsonpCallbackFunction;


        public override bool CanWriteType(Type type)
        {
            return true;
        }

        /// <summary>
        /// Override this method to capture the Request object
        /// </summary>
        /// <param name="type"></param>
        /// <param name="request"></param>
        /// <param name="mediaType"></param>
        /// <returns></returns>
        public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, System.Net.Http.HttpRequestMessage request, MediaTypeHeaderValue mediaType)
        {
            var formatter = new JsonpFormatter()
            {
                JsonpCallbackFunction = GetJsonCallbackFunction(request)
            };

            // this doesn't work unfortunately
            //formatter.SerializerSettings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;

            // You have to reapply any JSON.NET default serializer Customizations here    
            formatter.SerializerSettings.Converters.Add(new StringEnumConverter());
            formatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;

            return formatter;
        }


        public override Task WriteToStreamAsync(Type type, object value,
                                        Stream stream,
                                        HttpContent content,
                                        TransportContext transportContext)
        {
            if (string.IsNullOrEmpty(JsonpCallbackFunction))
                return base.WriteToStreamAsync(type, value, stream, content, transportContext);

            StreamWriter writer = null;

            // write the pre-amble
            try
            {
                writer = new StreamWriter(stream);
                writer.Write(JsonpCallbackFunction + "(");
                writer.Flush();
            }
            catch (Exception ex)
            {
                try
                {
                    if (writer != null)
                        writer.Dispose();
                }
                catch { }

                var tcs = new TaskCompletionSource<object>();
                tcs.SetException(ex);
                return tcs.Task;
            }

            return base.WriteToStreamAsync(type, value, stream, content, transportContext)
                       .ContinueWith(innerTask =>
                       {
                           if (innerTask.Status == TaskStatus.RanToCompletion)
                           {
                               writer.Write(")");
                               writer.Flush();
                           }

                       }, TaskContinuationOptions.ExecuteSynchronously)
                        .ContinueWith(innerTask =>
                        {
                            writer.Dispose();
                            return innerTask;

                        }, TaskContinuationOptions.ExecuteSynchronously)
                        .Unwrap();
        }

        /// <summary>
        /// Retrieves the Jsonp Callback function
        /// from the query string
        /// </summary>
        /// <returns></returns>
        private string GetJsonCallbackFunction(HttpRequestMessage request)
        {
            if (request.Method != HttpMethod.Get)
                return null;

            var query = HttpUtility.ParseQueryString(request.RequestUri.Query);
            var queryVal = query[this.JsonpParameterName];

            if (string.IsNullOrEmpty(queryVal))
                return null;

            return queryVal;
        }
    }

    而後找到<Global.asax>文件,在文件中添加如下內容

GlobalConfiguration.Configuration.Formatters.Insert(0, new JsonpFormatter());

    通過以上的操做,Asp.net將會對跨域請求進行處理,在網頁客戶端請求之後會獲得正確數據。

            $.ajax({
                type: "get",
                url: "http://10.140.45.238/api/HistoryDataList?p1=1&p2=2",
                dataType: "jsonp",
                success:function(data){
                    $.each(data,function(i,v){
                
                    });
                }
            });

服務端基本完成,具體的增刪改查能夠對Restful進行了解,網頁客戶端能夠對服務訪問並獲得數據信息,下一步會說明使用Jersey來做爲客戶端訪問。

相關文章
相關標籤/搜索