我编写了一个ASP.NET复合控件,其中包含一些与Web服务通信的Javascript。
我已将控件和服务的类打包到DLL中,以便人们在其他项目中使用它很容易。
我遇到的问题是,除了在项目中引用DLL之外,我的控件的使用者还必须包含Web服务的.ASMX文件。虽然它不是一个复杂的文件(只是一个引用DLL中的类的单行),但如果可以的话,我想避免使用它。
有没有办法避免必须拥有.ASMX文件?
感谢所有建议!
更新:在John Sheehan的回复链接中的文章(如下)确实有效 - 但如果您想使用AJAX调用Web服务则不行。有人知道AJAX友好版吗?
答案 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上的答案 3 :(得分:0)
考虑尝试页面方法(see this blog post)。您所要做的就是将web方法属性添加到后面的aspx代码中的静态方法。然后从客户端代码(javascript)访问PageMethod对象。不需要ASMX文件。希望这会有所帮助。
答案 4 :(得分:-7)
简短的回答是否定的。 ASMX是任何Web服务的入口点。如果您使用WCF,还有其他选择,但这并不完全相同。