不使用ASMX文件创建Web服务?

6
我编写了一个包含与 Web 服务通信的 JavaScript 的 ASP.NET 组合控件。我已将控件和服务的类打包到 DLL 中,以便用户可以轻松地在其他项目中使用它。
问题是,除了在项目中引用 DLL 外,我的控件使用者还必须包含 .ASMX 文件来使用 Web 服务。虽然这不是一个复杂的文件(只是一个指向 DLL 中类的一行代码),但如果可能的话,我想避免它。
有没有办法避免使用 .ASMX 文件?
- 我可以在 Application_Start 中注册服务吗? - 我可以通过更改 web.config 来引用它吗?
感谢所有建议!
更新:John Sheehan 在下面的回复中链接的文章确实有效,但如果您想使用 AJAX 调用 Web 服务,则无法使用。有人知道 AJAX 友好版本吗?

你能告诉我们 Ajax 的问题是什么吗? - ryber
抱歉 - 现在记不起来了 :o( - Chris Roberts
5个回答

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


完美,我已经寻找这个很长时间了。 - ryber

3
我知道这是一个非常老的问题,但它没有得到正确的回答,所以在这里给出解答:
默认情况下,每个 *.ASMX 请求都由 System.Web.Services.Protocols.WebServiceHandlerFactory 处理。
通过 .NET 反射器查看此类的源代码,可以创建没有 ASMX 文件的 Web 服务,但需要通过反射调用内部方法 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(context)

没有ASMX和web.config条目的繁琐步骤。

你能解释一下这段代码应该放在哪里吗?客户端代码需要有一个可访问的URL。如果web.config中没有ASMX占位符或httpHandler定义,那么入口URL是什么? - Nelson Rothermel
1
这种方法(在web.config中指定httpHandler)在大多数情况下运行良好,但是[System.Web.Script.Services.ScriptService]属性似乎被忽略了。发送到服务器的JSON会引发异常(格式无效),而MyService.asmx/jsMyService.asmx/jsdebug会返回500(在IE中)或401身份验证失败错误。使用占位符.asmx,这些问题就会消失。 - Nelson Rothermel
@nelson,如果您的IIS处于集成模式下,则所有HTTP请求都会通过ASP.NET引擎处理(即使没有web.config或asmx占位符文件)。因此,您需要覆盖其中一个asp.net生命周期方法,例如“Init”,并通过调用“httpHandler.ProcessRequest(context)”来注入您的httpHandler。显然,您需要已经设置变量“httpHandler”。这就是为什么我提供了将您的WebService类转换为通用“IHttpHandler”的方法。 - lubos hasko
明白了,这里关键是集成模式,但需要 IIS 7+。 - Nelson Rothermel

2

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

-7

简短的回答是不行。ASMX 是任何 Web 服务的入口点。如果你使用 WCF,有一些替代方案,但并非完全相同。


很抱歉你不喜欢这个答案,但它确实是正确的答案。 - Chris
2
除了这一点之外,你可以将 Web 服务放在类库中,并通过 web.config 进行连接。 - John Sheehan
除非是这样。我说的“简短”答案是否定的。而且你不能在没有.asmx文件的情况下托管常规Web服务。你链接的文章肯定描述了一种解决方法,但它是非标准的,而且是相当冗长的解决方案(也就是说,不够简短)。 - Chris
2
实际上,这篇文章很短,易于实现。我认为不包括空格的代码总量<10行。怎么会“长”呢?我也看不出它有什么非标准的地方。它没有使用任何隐藏的API,也没有引起Microsoft的任何警告。它非常简单,我现在成功地在使用它。 - ryber
微软经常有我所谓的“非程序员”方式和程序员方式来做同一件事情。前者通常涉及GUI和/或拖放,以便将技术营销给大众,称其为“易于实现!”(例如源树中的空的冗余ASMX文件)。当然,后者通常没有那么受关注。但是请务必不要将其与“非标准”混淆,也不要认为纯编程方式是错误或复杂的。 - John K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接