我的思路是这样的:
1、需要找一个访问Webservice的统一入口,就像asp.net中的handler中的一个事件,就是每次访问这个webservice都会进入这个事件中。
2、需要获得访问Webservice的接口名称,这样就可以与数据库中存储的接口名称相比较,可以获得这个接口是否公开,然后根据是否公开进行下一步处理。
但是经过一番百度、谷歌未果,也问了同事,没有听说过这种方法,不知道这个方案可行不,或者有没有其他可替代的方案,希望做过这种需求的同学们给予帮助,在此感激不尽!
简单的很,因为 Web Service 的框架跟 Asp.Net MVC 的一样,任何请求都会先经过类似 Handler 的一个接口,然后根据传入消息的 SOAP Action 去找到适配的方法调用。当然,实际上,针对授权,WCF 可以让你很容易的定制。Asp.Net Web Service 请看这里:http://msdn.microsoft.com/en-us/library/ff648643.aspx。
其实,方法还有很多,只是,下次你提问前,你先说清楚,你的 Web Service 用什么框架实现的。
好的 谢谢提醒 刚接触Webservice 我以为只有.net 叫Webservice的 其他的有另外的名字 我想起来 这个webservice本来就是建立在asp.net 项目中的 应该跟webform一样的道理 但是那个soap action 要怎么获取到呢?这几天查的资料,我知道可以用url截取最后的字符串获取方法名
@灬达: 你先学习下:http://www.iwms.net/n405c12.aspx
另外,你对 Asp.Net 认证和授权熟悉吗?
最后,你先告诉我“进行下一步处理”,你的下一步处理到底如何处理?也就是说如果不公开的话,你希望服务干什么?
@Launcher: 嗯 谢谢 这方面基础挺差的 的补一下 进一步处理 是指 获得方法名后 查询 后台管理系统的数据库 如果在数据库中这个接口被关闭 就不让他访问这个接口 如果公开 就可以访问 这样就可以动态的管理这些接口了
@灬达: 不让他访问是如何体现给客户端的?
@Launcher: 就是一个字段“状态”的值,如果是1就公开,如果是0就是不公开,数据库是这样存的,然后有页面对接口的相关信息进行管理
@灬达: 其实我想要的结果是,如果不公开,服务返回 http status code 401 或 403。看来你也说不清楚,那你只能自己看这里了:http://msdn.microsoft.com/zh-cn/library/vstudio/9z52by6a(v=vs.100).aspx,通过自定义 IHttpMoudle 可以在调用 WebMethod 之前就拿到 Request,然后根据 Request 的 RequestUri(GET)或 Headers(POST)来得到客户端请求的 WebMethod 名称。
@Launcher: 嗯 是我想要的答案 谢谢你了
感觉你这个思路就和我们控制用户的权限一样,开了这个权限用户就能访问到具体的信息。
其实应该可以写一个CommonServices,大家共同继承他吧,如果用户请求的这个页面开放,就进入需要操作的webservice接口。
嗯 我理解 但是我要控制 这个服务中的每个方法的公开与否 如果是继承的话 怎么实现控制每个方法的访问?
@灬达:你的提问不是说只是公开接口么,怎么又是接口的方法了。这个也好办啊,几类return true 和false,如果是true,进入方法,如果不是,直接返回null
@雾静: 不好意思 怪我描述不清楚 我说的接口就是指服务中的公开的方法名,可能对接口理解的不是很好,我所有的方法都写在asmx.cs这个类中 没有其他的类 我就是为了控制访问的方法 可能不需要继承了吧
同意楼上,你很难动态的去发布一个web service接口给不同的人群。所以实际的办法就是在执行web service的时候去判断,如果有权限,就执行,没权限,就返回错误。而这个通用的东西放在一个基类里面比较恰当。
但是这样也控制不了每个方法的访问啊,要怎么实现继承呢?