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来做为客户端访问。

相关文章
相关标签/搜索