English 中文(简体)
如何在没有ASMX文件的情况下创建网络服务?
原标题:
  • 时间:2008-11-27 18:00:36
  •  标签:

我编写了一个包含一些与Web服务通信的JavaScript的ASP.NET组合控件。

我已经将控制和服务类打包成DLL,使其他人在其他项目中使用它变得轻松而方便。

我的问题是,在引用我的控件的DLL项目中,使用者还必须包含一个.ASMX文件以使用Web服务。虽然这并不是一个复杂的文件(只是一个指向DLL中类的单行代码),但我希望能够避免使用它。

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

  • Can I register the service with the web server in Application_Start?
  • Can I make a web.config change to reference it somehow?

所有建议都受到感激!

更新: 约翰 · 谢恩(John Sheehan)在下面的回复中链接的文章是有效的 - 但是,如果您想使用 AJAX 调用网络服务,就不起作用了。 有人知道一个 AJAX 友好版吗?

问题回答

尝试一些类似这样的东西。我不知道它是否有效。我从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

我知道这是一个很老的问题,但是它没有被正确回答,所以在这里。

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

通过.NET反射器查看此类的源代码,可以实现没有ASMX文件的Web服务,但需要通过反射调用内部方法CoreGetHandler

以下方法将获取您的WebService并返回它的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(context) 的中文翻译是:httpHandler.ProcessRequest(context)。

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

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

在Codeproject上创建Web服务的类库项目。

考虑尝试使用页面方法(请参见此博客文章)。您只需要在aspx代码后面的静态方法中添加web方法属性,然后从客户端代码(javascript)访问PageMethod对象即可。不需要ASMX文件。希望这能帮到您。





相关问题
热门标签