代码之家  ›  专栏  ›  技术社区  ›  Chris Roberts

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

  •  6
  • Chris Roberts  · 技术社区  · 16 年前

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

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

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

    有没有什么方法可以避免必须拥有。ASMX文件?

    • 我可以在应用程序启动中向web服务器注册服务吗?
    • 我能做个网吗。配置更改以某种方式引用它?

    感谢您的建议!

    更新: 在John Sheehan的回复(以下)中链接到的文章确实有效——但如果您想使用AJAX调用web服务,就不行了。有人知道AJAX友好的版本吗?

    5 回复  |  直到 16 年前
        1
  •  5
  •   John Sheehan    16 年前

    试试这样。但我不知道它是否有效。我从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

        2
  •  3
  •   lubos hasko    15 年前

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

    每一天*。默认情况下,ASMX请求由 System.Web.Services.Protocols.WebServiceHandlerFactory .

    在中查看这个类的源代码。NET reflector,可以在没有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,也没有网络。配置条目。

        3
  •  2
  •   cspolton Abbia    12 年前

    以下是一篇关于你的问题的很好的工作文章:

    Creating Web Services in a Class Library project 在Codeproject上。

        4
  •  0
  •   Darwyn    16 年前

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

        5
  •  -7
  •   Chris    16 年前

    简而言之,答案是否定的。ASMX是任何web服务的入口点。如果使用WCF,也有其他选择,但这并不完全相同。