创建没有ASMX文件的Web服务?

时间:2008-11-27 18:00:37

标签: asp.net vb.net web-services

我编写了一个ASP.NET复合控件,其中包含一些与Web服务通信的Javascript。

我已将控件和服务的类打包到DLL中,以便人们在其他项目中使用它很容易。

我遇到的问题是,除了在项目中引用DLL之外,我的控件的使用者还必须包含Web服务的.ASMX文件。虽然它不是一个复杂的文件(只是一个引用DLL中的类的单行),但如果可以的话,我想避免使用它。

有没有办法避免必须拥有.ASMX文件?

  • 我可以在Application_Start中使用Web服务器注册服务吗?
  • 我可以进行web.config更改以某种方式引用它吗?

感谢所有建议!

更新:在John Sheehan的回复链接中的文章(如下)确实有效 - 但如果您想使用AJAX调用Web服务则不行。有人知道AJAX友好版吗?

5 个答案:

答案 0 :(得分:5)

尝试这样的事情。我不知道它是否会起作用。我从ELMAH那里得到了这个想法,它为一个实际上不存在的页面创建了一个处理程序,然后从程序集中提供它。

<configuration>
   <system.web>
      <httpHandlers>
         <add verb="*" path="*WebService.asmx" type="MyHandler.WebServiceHandler, MyHandler" />
      </httpHandlers>
   </system.web>
</configuration>

编辑:我很接近,看到这篇文章(虽然在VB中):http://www.codeproject.com/KB/aspnet/wsinaclasslibrary.aspx

答案 1 :(得分:3)

我知道这是一个非常古老的问题,但它没有得到妥善回答,所以这里是:

每个* .ASMX请求默认由System.Web.Services.Protocols.WebServiceHandlerFactory处理。

在.NET反射器中查看此类的源代码,可以在没有ASMX文件的情况下使用webservice,但是您需要通过反射调用内部方法CoreGetHandler

以下方法将获取您的Web服务并返回其IHttpHandler。

public IHttpHandler GetHttpHandlerForWebService(WebService webService, HttpContext context)
{
    var webServiceType = webService.GetType();
    var wshf = new System.Web.Services.Protocols.WebServiceHandlerFactory();
    var coreGetHandler = wshf.GetType().GetMethod("CoreGetHandler");
    var httpHandler = (IHttpHandler)coreGetHandler.Invoke(wshf, new object[] { webServiceType, context, context.Request, context.Response });
    return httpHandler;
}

获得httphandler后,只需拨打电话

即可
  

httpHandler.ProcessRequest(上下文)

完成。没有ASMX,没有web.config条目。

答案 2 :(得分:2)

这是一篇关于你的问题的非常好的工作文章:

CodeProject上的

Creating Web Services in a Class Library project

答案 3 :(得分:0)

考虑尝试页面方法(see this blog post)。您所要做的就是将web方法属性添加到后面的aspx代码中的静态方法。然后从客户端代码(javascript)访问PageMethod对象。不需要ASMX文件。希望这会有所帮助。

答案 4 :(得分:-7)

简短的回答是否定的。 ASMX是任何Web服务的入口点。如果您使用WCF,还有其他选择,但这并不完全相同。