文档章节

Jersey访问Asp.net MVC5 Web Api 一

mylife1984
 mylife1984
发布于 2014/09/25 18:10
字数 1058
阅读 49
收藏 0

       由于项目需要通过使用客户提供的DLL来获取数据,但是没有Java的接口,DLL动态库是64位的,项目使用的JDK是32位的(好像32位的JDK只能访问32位的DLL,但是有没有其他的方法,那就不得知了)。开始想用WebService的,但是WebService有点繁琐,也比较重,最近在了解Restful,想来想去用这个来试试,下面来说说开发过程中遇到的问题和需要注意的地方。

    一,服务端

        开发环境:VS2013,.Net Framework 4.5.1,MVC5.2,Nuget

    使用VS2013新建一个项目,点击获取联机模板

    

找到图片中选中的模板,点击确定,使用模板会少一些繁杂的设置

项目已经创建完成,把客户提供的DLL引导项目中,因为DLL只能在64位平台运行,而且这个动态库还调用C++编写的动态库,C++的动态库还是32位的,这个时候需要修改两个地方,要不会报错。

1、右键“解决方案”-- “配置管理器“ 将平台从”Any Cpu“改成”x64“

2、在菜单中选择”工具“ -- ”选项“ -- ”项目与解决方案“ -- ”Web项目“将”对网站和项目使用IIS Express的64位版“选中

接着更新项目中使用的插件,Nuget类似Java中的Maven,使用命令就可以更行相关插件,非常方便

右键项目--”管理Nuget程序包“--”更新“在此处可以更新相关的程序包,还可以用命令来更新程序包

准备阶段完成,现在进入实际开发,先创建一个控制器,右键”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来作为客户端访问。

© 著作权归作者所有

mylife1984
粉丝 0
博文 5
码字总数 1127
作品 0
朝阳
高级程序员
私信 提问
ASP.NET MVC5 高级编程-学习日记-第一章 入门

1.1 ASP.NET MVC 简介 ASP.NET是一种构建Web应用程序的框架,它将一般的MVC(Model-View-Controller)模式应用于ASP.NET框架。 1.1.1 MVC模式简介 MVC将应用程序的用户界面(User Interface, UI...

可达鸭要进化
2018/12/13
0
0
VS2013中的MVC5模板部署到mono上的艰辛历程

部署环境:CentOS7 + Mono 3.10 + Jexus 5.6 在Xamarin.Studio创建的asp.net项目,部署过程非常顺利,没有遇到什么问题;但在VS2013中创建的asp.net项目,部署过程会有一些波折。现在想想,原...

小近
2014/10/28
3.7K
8
记一次ASP.NET MVC4 升级到MVC5的小问题解决

原文:记一次ASP.NET MVC4 升级到MVC5的小问题解决 .NET 4.0 MVC4版本,升级到.NET 4.6.1 MVC5: 1.使用nuget更新所有 与mvc相关的类库; 2.更改~/Views/web.config(如果有Area,Area下面的web.c...

杰克.陈
2017/12/06
0
0
跌倒了,再爬起来:ASP.NET 5 Identity

“跌倒了”指的是这一篇博文:爱与恨的抉择:ASP.NET 5+EntityFramework 7 如果想了解 ASP.NET Identity 的“历史”及“原理”,强烈建议读一下这篇博文:MVC5 - ASP.NET Identity登录原理 ...

林羽恒
2017/06/19
0
0
ASP.NET MVC5请求管道和生命周期

请求处理管道 请求管道是一些用于处理HTTP请求的模块组合,在ASP.NET中,请求管道有两个核心组件:和。所有的HTTP请求都会进入,有进行最终的处理,而通过订阅对象中的事件,可以在对HTTP请求...

雪飞鸿
2017/04/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins系列_插件安装及报错处理

进入Jenkins之后我们可以进行插件的安装,插件管理位于以下模块: 发现上面报了一堆错误,是因为插件的依赖没有安装好,那么这一节,就先把这些错误解决掉吧。解决完成后,也就基本会使用插件...

shzwork
今天
2
0
mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)

查询所有字段 select * from 表名; 查询自定字段 select 字段名 from 表名; 查询指定数据 select * from 表名 where 条件; 带关键字IN的查询 select * from 表名 where 条件 [not] in(元素...

edison_kwok
昨天
9
0
解决多线程并行加载缓存问题(利用guava实现)

依赖 com.google.guava:guava:20.0 import com.google.common.cache.Cache;import com.google.common.cache.CacheBuilder;import java.util.concurrent.ExecutionException;import j......

暗中观察
昨天
3
0
利用VisualVM 内存查看

准备工作,建几个测试类。等下就是要查看这几个类里面的属性 package visualvm;public class MultiObject { private String str; private int i; MultiObject(String str...

冷基
昨天
2
0
组装一台工作游戏两用机

一、配置清单如下: 分类 项目 价格(元) 主板 华硕(ASUS)TUF Z370-PLUS GAMING II 电竞特工 Z370二代 支持9代CPU 1049 CPU 英特尔(Intel) i7 8700K 酷睿六核 盒装CPU处理器 2640 风扇 九...

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部