C#下丢掉.asmx文件的WebService的实现
我在用.net实现Webservice的时候发现需要一个没有任何用处的.asmx文件,但是却没法删除,这两天我实现一个通过接口时想实现dll直接部署,不需要弄个.asmx文件.翻阅了很多,最后在Spring.net里面得到了启示.
我要实现的方式是直接在httpHandlers中配置
<httpHandlers>
<add verb="*" path="XXXservice.asmx" type="CampusWebService.DataService,CampusWebService"/>
</httpHandlers>
然后通过就可以直接部署,特别适合进行二次开发,嵌入式开始什么的.
具体的实现如下:
先需需要通过继承反射实现一个c#的程序集封装的调用(很讨厌C#的程序集封装,讨嫌的要死)
/// <summary>/// WebService处理类./// </summary>[PermissionSet(SecurityAction.InheritanceDemand, Unrestricted = true)]internal class WebServiceHandlerFactory<T> : System.Web.Services.Protocols.WebServiceHandlerFactory, IHttpHandlerFactorywhere T : WebService{#region 成员变量,构造函数./// <summary>/// 核心方法反射调用./// </summary>private static readonly MethodInfo CoreGetHandler = typeof(System.Web.Services.Protocols.WebServiceHandlerFactory).GetMethod("CoreGetHandler",BindingFlags.NonPublic | BindingFlags.Instance,null,new Type[] { typeof(Type), typeof(HttpContext), typeof(HttpRequest), typeof(HttpResponse) },null);private Type serviceType;/// <summary>/// 构造函数./// </summary>/// <param name="serviceType"></param>public WebServiceHandlerFactory(T serviceType){this.serviceType = serviceType.GetType();}#endregion#region IHttpHandlerFactory 成员/// <summary>////// </summary>/// <param name="context"></param>/// <param name="requestType"></param>/// <param name="url"></param>/// <param name="pathTranslated"></param>/// <returns></returns>IHttpHandler IHttpHandlerFactory.GetHandler(HttpContext context, string requestType, string url, string pathTranslated){if (this.serviceType == null){throw new ArgumentNullException("serviceType","服务类型为NULL!");}new AspNetHostingPermission(AspNetHostingPermissionLevel.Minimal).Demand();return (IHttpHandler)CoreGetHandler.Invoke(this, new object[] { this.serviceType, context, context.Request, context.Response });}/// <summary>////// </summary>/// <param name="handler"></param>void IHttpHandlerFactory.ReleaseHandler(IHttpHandler handler){base.ReleaseHandler(handler);}#endregion}
这个类可以成为一个工具类,这个类的是系统级的Web.config中所有.asmx文件的解析类,重载的目的就是把原来基于路径的访问变成对象访问,
这里的Url就是指向我们常用的只有一句话的.asmx文件.
我们发现CoreGetHandler是调用的目标WebService的type,但是这个函数是程序集可见,不能被我们调用,只能用万能的反射来弄,
最后我们的WebService的实现为.
/// <summary>/// 数据服务接口./// </summary>[WebService(Name="数字校园数据服务接口",Namespace="http://yaesoft.com",Description = "为第三方应用提供的基础数据服务接口")][WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]public class DataService : WebService,IHttpHandler{#region 成员变量,构造函数./// <summary>/// 构造函数./// </summary>public DataService(){}#endregion#region Web服务函数./// <summary>/// 获取组织部门数据./// </summary>/// <param name="type">部门类型.</param>/// <returns>部门信息集合.</returns>[WebMethod(Description = "获取组织部门数据.")]public List<Dept> Departments(EnumDeptType type){///TODO:return null;}/// <summary>/// 获取教师用户数据./// </summary>/// <param name="deptCode">部门代码</param>/// <returns>教师用户集合.</returns>[WebMethod(Description = "获取教师用户数据.")]public List<User> Teachers(string deptCode){///TODO:return null;}#endregion#region IHttpHandler 成员/// <summary>////// </summary>public bool IsReusable{get { return false; }}/// <summary>////// </summary>/// <param name="context"></param>public void ProcessRequest(HttpContext context){IHttpHandlerFactory factory = (IHttpHandlerFactory)new WebServiceHandlerFactory<DataService>(this);IHttpHandler handler = factory.GetHandler(context, null, null, null);handler.ProcessRequest(context);}#endregion}
由于我们是WebService类,因此得继承WebService,
我们需要在HttpHandlers中使用,所以至少要继承IHttpHandler接口,
而解析是在HTTPHandler接口中进行的所以我们得在
public void ProcessRequest(HttpContext context){IHttpHandlerFactory factory = (IHttpHandlerFactory)new WebServiceHandlerFactory<DataService>(this);IHttpHandler handler = factory.GetHandler(context, null, null, null);handler.ProcessRequest(context);}
这个方法的内容基本是不需要变化的,
我们可以将这个类进行抽象,作为我们所有的Webservice的基础类来使用,
然后只要在Web.config中进行HttpHandlers中进行配置即可发布WebService服务!
C#下丢掉.asmx文件的WebService的实现相关推荐
- 你是否觉得.Net Web Service 中asmx文件是多余的?
用.Net开发 WebService一般都会先添加一个.asmx文件,然后在其.cs文件里将类标记上WebService,WebMethod等特性来构建WebService.是否想过.asmx文件是多 ...
- php 如何利用 soap调用.Net的WebService asmx文件
原文:php 如何利用 soap调用.Net的WebService asmx文件 最近,帮一个同行测试用.net写的WebService接口,C#调用通过,现在需要测试一下php版本对它的调用,经过各 ...
- php .asmx,PHP应用:php实现通过soap调用.Net的WebService asmx文件
<PHP应用:php实现通过soap调用.Net的WebService asmx文件>要点: 本文介绍了PHP应用:php实现通过soap调用.Net的WebService asmx文件, ...
- php .asmx,php实现通过soap调用.Net的WebService asmx文件
本文实例讲述了php实现通过soap调用.Net的WebService asmx文件.分享给大家供大家参考,具体如下: 最近,帮一个同行测试用.net写的WebService接口,C#调用通过,现在需 ...
- php .asmx,php实现soap调用.Net的WebService asmx文件
本文实例讲述了php实现通过soap调用.Net的WebService asmx文件.分享给大家供大家参考,具体如下: 最近,帮一个同行测试用.net写的WebService接口,C#调用通过,现在需 ...
- aspx、ashx、asmx文件处理请求效率比较
aspx.ashx.asmx文件处理请求效率比较 原文: http://www.cnblogs.com/liuche/p/3464051.html 你曾经是否苦恼过在系统中使用哪种文件编写客户端请求最 ...
- cmd命令生成webservice_根据wsdl文件生成WebService客户端代码
有时候在项目中,一个项目可能有好几个公司在做.系统之间难免会出现互相调用接口的现象,这时候有一种办法就是使用webService.本篇文章将介绍如何将对接系统提供的WebService接口,根据对方提 ...
- scp 保留文件属组_scp 对拷文件夹 和 文件夹下的所有文件 对拷文件并重命名
对拷文件夹 (包括文件夹本身) scp -r /home/wwwroot/www/charts/util root@192.168.1.65:/home/wwwroot/limesurvey_ba ...
- 在没有 IIS 的条件下运行 ASMX
http://www.microsoft.com/china/MSDN/library/WebServices/WebServices/ServiceStation.mspx 在没有 IIS 的条件下 ...
最新文章
- [SinGuLaRiTy] 贪心题目复习
- Login failed with an access denied error.
- PCL点云库法向量显示,vtk错误“no override found for vtkActor”
- 小议Linux staging tree
- 硒等待:内隐,外显,流利和睡眠
- 什么是Ext(ExtJs)【转载】
- php7安装redis扩展和memcache扩展
- github 建立博客
- c语言定积分的基本思想_积分的计算方法、技巧、思路总结~
- docker 命令_Docker的入门:安装Docker及记住常用的镜像命令和容器命令
- 揭秘360手机助手未经用户同意,自动开启辅助的“黑科技”
- Windows系统邮件中如何绑定QQ邮箱
- Mand Mobile - 基于金融场景的Vuejs组件库
- 精挑细选的良心APP,每款都非常惊艳
- 详解ArcGIS Server瓦片合并
- 微信小程序体验评分问题
- 网站镶嵌网站显示代码
- 性能测试的实施及总结(二)
- 2021-2027全球与中国电化学分析设备市场现状及未来发展趋势
- 获取MAC地址的四种方法(转)