我在用.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的实现相关推荐

  1. 你是否觉得.Net Web Service 中asmx文件是多余的?

    用.Net开发 WebService一般都会先添加一个.asmx文件,然后在其.cs文件里将类标记上WebService,WebMethod等特性来构建WebService.是否想过.asmx文件是多 ...

  2. php 如何利用 soap调用.Net的WebService asmx文件

    原文:php 如何利用 soap调用.Net的WebService asmx文件 最近,帮一个同行测试用.net写的WebService接口,C#调用通过,现在需要测试一下php版本对它的调用,经过各 ...

  3. php .asmx,PHP应用:php实现通过soap调用.Net的WebService asmx文件

    <PHP应用:php实现通过soap调用.Net的WebService asmx文件>要点: 本文介绍了PHP应用:php实现通过soap调用.Net的WebService asmx文件, ...

  4. php .asmx,php实现通过soap调用.Net的WebService asmx文件

    本文实例讲述了php实现通过soap调用.Net的WebService asmx文件.分享给大家供大家参考,具体如下: 最近,帮一个同行测试用.net写的WebService接口,C#调用通过,现在需 ...

  5. php .asmx,php实现soap调用.Net的WebService asmx文件

    本文实例讲述了php实现通过soap调用.Net的WebService asmx文件.分享给大家供大家参考,具体如下: 最近,帮一个同行测试用.net写的WebService接口,C#调用通过,现在需 ...

  6. aspx、ashx、asmx文件处理请求效率比较

    aspx.ashx.asmx文件处理请求效率比较 原文: http://www.cnblogs.com/liuche/p/3464051.html 你曾经是否苦恼过在系统中使用哪种文件编写客户端请求最 ...

  7. cmd命令生成webservice_根据wsdl文件生成WebService客户端代码

    有时候在项目中,一个项目可能有好几个公司在做.系统之间难免会出现互相调用接口的现象,这时候有一种办法就是使用webService.本篇文章将介绍如何将对接系统提供的WebService接口,根据对方提 ...

  8. scp 保留文件属组_scp 对拷文件夹 和 文件夹下的所有文件 对拷文件并重命名

    对拷文件夹 (包括文件夹本身) scp -r   /home/wwwroot/www/charts/util root@192.168.1.65:/home/wwwroot/limesurvey_ba ...

  9. 在没有 IIS 的条件下运行 ASMX

    http://www.microsoft.com/china/MSDN/library/WebServices/WebServices/ServiceStation.mspx 在没有 IIS 的条件下 ...

最新文章

  1. [SinGuLaRiTy] 贪心题目复习
  2. Login failed with an access denied error.
  3. PCL点云库法向量显示,vtk错误“no override found for vtkActor”
  4. 小议Linux staging tree
  5. 硒等待:内隐,外显,流利和睡眠
  6. 什么是Ext(ExtJs)【转载】
  7. php7安装redis扩展和memcache扩展
  8. github 建立博客
  9. c语言定积分的基本思想_积分的计算方法、技巧、思路总结~
  10. docker 命令_Docker的入门:安装Docker及记住常用的镜像命令和容器命令
  11. 揭秘360手机助手未经用户同意,自动开启辅助的“黑科技”
  12. Windows系统邮件中如何绑定QQ邮箱
  13. Mand Mobile - 基于金融场景的Vuejs组件库
  14. 精挑细选的良心APP,每款都非常惊艳
  15. 详解ArcGIS Server瓦片合并
  16. 微信小程序体验评分问题
  17. 网站镶嵌网站显示代码
  18. 性能测试的实施及总结(二)
  19. 2021-2027全球与中国电化学分析设备市场现状及未来发展趋势
  20. 获取MAC地址的四种方法(转)

热门文章

  1. pacs dicom3.0 DCMTK EFilm
  2. MATLAB摄像头库外人脸识别考勤系统【摄像头,GUI,库外识别,语音报警,论文】
  3. 使用javacv进行语音文件分割
  4. 恰果果囖!测评CSDN浏览器助手--chrome插件
  5. 横版1:2500万标准中国地图
  6. 微服务架构:Nacos本地缓存 PK 微服务优雅下线
  7. ----web前端 实验二
  8. 揭秘封包辅助外G:处理游戏多线程发送封包(三)
  9. Kubernetes VS Mesos
  10. 怎么查看计算机显卡类型,如何查看电脑显卡支持类型?查看显卡支持类型方法...