因爲項目須要經過使用客戶提供的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來做爲客戶端訪問。