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, IHttpHandlerFactory
where 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文件的解析类,重载的目的就是把原来基于路径的访问变成对象访问,

.net框架的原版实现是这样的

 1 public IHttpHandler GetHandler(HttpContext context, string verb, string url, string filePath)
2 {
3 TraceMethod caller = Tracing.On ? new TraceMethod(this, "GetHandler", new object[0]) : null;
4 if (Tracing.On)
5 {
6 Tracing.Enter("IHttpHandlerFactory.GetHandler", caller, Tracing.Details(context.Request));
7 }
8 new AspNetHostingPermission(AspNetHostingPermissionLevel.Minimal).Demand();
9 Type compiledType = WebServiceParser.GetCompiledType(url, context);
10 IHttpHandler handler = this.CoreGetHandler(compiledType, context, context.Request, context.Response);
11 if (Tracing.On)
12 {
13 Tracing.Exit("IHttpHandlerFactory.GetHandler", caller);
14 }
15 return handler;
16 }

这里的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. php 如何利用 soap调用.Net的WebService asmx文件

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

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

    人生总是面临着许多抉择许多困惑!作为一名“攻城师”或“程序猿”的我们,工作的时候更是如此.你曾经是否苦恼过在系统中使用哪种文件编写客户端请求最合适或最高效呢?aspx.ashx.asmx到底该如何选择 ...

  3. 人生的抉择—aspx、ashx、asmx文件处理请求效率比较

    人生总是面临着许多抉择许多困惑!作为一名"攻城师"或"程序猿"的我们,工作的时候更是如此.你曾经是否苦恼过在系统中使用哪种文件编写客户端请求最合适或最高效呢?a ...

  4. IO流的练习3 —— 复制多级文件夹下的指定文件并改名

    需求:复制指定目录下的指定文件,并修改后缀名. 指定的文件是:.java文件. 指定的后缀名是:.jad 数据源所在文件夹:C:\Users\Administrator\Desktop\记录 目的地所 ...

  5. windows下vs2012用gsoap开发webservice实例

    零:说明 1.本文是根据网上前人经验结合自己动手操作写成,开发工具用的vs2012,gsoap用的是gsoap-2.8: 2.gsoap提供的工具简单介绍 1)wsdl2h.exe:根据WSDL文件生 ...

  6. GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级

    一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...

  7. mac下查看.mobileprovision文件及钥匙串中证书.cer文件

    mac下查看.mobileprovision文件及钥匙串中证书.cer文件 一. mobileprovision文件查看 xxx.mobileprovision是ios开发中的设备描述文件,里面有证书 ...

  8. php清理当前目录下的指定文件和空目录(源码),建议服务器端执行

    <?php /** * @desc 解析当前目录并递归删除目录下的指定文件 * @author mengdj<mengdj@outlook.com> 2014.10.02 1530 ...

  9. 用脚本如何实现将Linux下的txt文件批量转化为Windows下的txt文件?

    众所周知,Windows和Linux的文件换行回车格式不同,Windows下换行格式是\r\n(回车+换行),Linux下换行格式为\n(只是换行),因此,其中一个操作系统的文本文件若需要在另外一个中 ...

随机推荐

  1. boost进程间通信经常使用开发一篇全(消息队列,共享内存,信号)

    本文概要: 敏捷开发大家想必知道并且评价甚高,缩短开发周期,提高开发质量.将大project独立为不同的小app开发,整个开发过程,程序可用可測,所以提高了总体的质量.基于这样的开发模式和开发理念,进 ...

  2. Cocos2D-X2.2.3学习笔记3(内存管理)

    本章节介绍例如以下: 1.C/C++内存管理机制 2.引用计数机制 3.自己主动释放机制 1.C/C++内存管理机制 相信仅仅要懂oop的都知道NEW这个keyword吧,这个通俗点说事实上就是创建对 ...

  3. windows socket 网络编程

    样例代码就在我的博客中,包含六个UDP和TCP发送接受的cpp文件,一个基于MFC的局域网聊天小工具project,和此小工具的全部执行时库.资源和执行程序.代码的压缩包位置是http://www.b ...

  4. SVN:One or more files are in a conflicted state

    解决代码冲突 如果commit时出现"You have to update your work copy first."红色警告,说明版本库中的此文件已经被其他人修改了. 请先点& ...

  5. LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新

    原文:LINQ To SQL在N层应用程序中的CUD操作.批量删除.批量更新 0. 说明 Linq to Sql,以下简称L2S.    以下文中所指的两层和三层结构,分别如下图所示: 准确的说,这里 ...

  6. ASP.NET抓取网页内容

    原文:ASP.NET抓取网页内容 一.ASP.NET 使用HttpWebRequest抓取网页内容 这种方式抓取某些页面会失败 不过,有时候我们会发现,这个程序在抓取某些页面时,是获不到所需的内容的, ...

  7. 通过如何通过js实现复制粘贴功能

    在ie中window.clipboardData(剪切板对象)是可以被获取,所以利用这个方法我们可以实现在IE当中复制粘贴的功能,demo如下! <html> <head> & ...

  8. JavaScript语言基础知识8

    这篇文章是对前面学习的知识进行总结: 1.JavaScript支持多种数据类型,如数值类型.字符串类型.布尔类型等. 2.在JavaScript中,字符串是用引號括起来的字符系列,转义字符能够用来表示 ...

  9. [翻译]初识SQL Server 2005 Reporting Services Part 2

    原文:[翻译]初识SQL Server 2005 Reporting Services Part 2 在Part 1文章中我们对SQL Server Reporting Services 2005(S ...

  10. Codeforces 10D LCIS 找出最长公共子和产量增加这个序列 dp

    主题链接:点击打开链接 意甲冠军: 特定n长序列 给定k长序列 求LCIS并输出这个子序列 如有多解输出随意解.. = - = 敲的时候听着小曲儿pre的含义还没有想清楚,万万没想到就过了... #i ...