• 把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会有问题。改变一些代码(注释和格式无效),达到同样的目的,可能他就好了。

  • 相关阅读:
    Ajax 发送OPTION请求
    用cssText批量修改样式
    原生js操作HTML DOM
    每天干的啥?(2018.09)
    每天干的啥?(2018.08)
    每天干的啥?(2018.07)
    每天干的啥?(2018.06)
    每天干的啥?(2018.05)
    每天干的啥?(2018.04)
    每天干的啥?(2018.03)
  • 原文地址:https://www.cnblogs.com/czcz1024/p/3106378.html
Copyright © 2020-2023  润新知