把wcf服务,改成restful方式,以及吐槽

昨天java的同事,和我说,在java调用.net的wcf服务时,生成代理类会占用大量内存,最好改成restful形式。

但是我们的wcf被自己的.net程序各种调用。在不更改.net调用方式的前提下,提供restful方式的调用

经过一些尝试,修改步骤如下

1、在wcf的接口里,每个方法加上[WebGet]

2、写一个新的服务,继承原来的服务,这个新服务的地址和原来不一样了,所以不影响以前服务的调用

3、编辑svc文件,加上Factory="System.ServiceModel.Activation.WebServiceHostFactory"

 

然后就开始各种报错了

首先是简单地问题

当方法里包含out参数时,需要[WebGet(BodyStyle = WebMessageBodyStyle.Wrapped)]才能正确解析

稍微麻烦一点的问题,当方法里含有T[],IEnumerable<T>,Nullable<T> 这些类型的参数时,微软没有提供自动从url的querystring里把string类型的字符转成这些类型的方法。

需要自定义,参考http://code.msdn.microsoft.com/Support-for-arrays-in-53c276ae/sourcecode?fileId=26382&pathId=912880959

写attribute加到新的服务类上,参考http://www.cnblogs.com/tuoxieyz/archive/2011/08/03/2125156.html

处理了这些步骤,理论上就可以正常访问了。

 

下面是吐槽

我们的项目是之前用vs2010,.net 4.0开发的。后来我把vs升级到了2012,用了一段时间发现2012的编译好像有点问题(也许是有什么我不了解的东西)

按照上面的方法,我已经搞好一个wcf的restful了,各种参数都运行良好,然后搞另一个wcf,报错说不支持Nullable,然后各种调试无果,把不支持的那个方法改了名字,通过了。

然后搞第三个wcf,报不支持IEnumerable,果断改名,又通过了。谁能告诉我这是什么原理,难道我机器上乱七八糟东西装的太多,还有兼容性问题?

 

之前还遇到过更诡异的问题,同样的代码,没改过,vs2012 debug,正常,vs2010 debug release正常,vs2012 release编译过了,运行报错。

因为是release,也没法跟踪,我想看看是否有inner exception,于是try catch,throw inner,release编译,然后他就不报错啦。

通过遇到的几次这种见鬼问题,我感觉vs2012的编译器在某些情况下生成出来的dll会有问题。改变一些代码(注释和格式无效),达到同样的目的,可能他就好了。

posted @ 2013-05-29 17:24  czcz1024  阅读(304)  评论(0编辑  收藏  举报