2008-11-27 18 views
6

我寫了一個ASP.NET複合控件,其中包含一些與Web服務通信的Javascript。不使用ASMX文件創建Web服務?

我已經將控件和服務的類打包到一個DLL中,以便人們可以在其他項目中使用它。

我遇到的問題是,以及在他們的項目中引用DLL時,我的控件的使用者還必須爲Web服務包含一個.ASMX文件。雖然它不是一個複雜的文件(只是一個指向DLL中的類的單線程),但如果可以的話,我想避免它。

有什麼辦法可以避免必須擁有.ASMX文件嗎?

  • 我可以在Application_Start中向Web服務器註冊服務嗎?
  • 我可以做一個web.config更改以某種方式引用它?

所有建議感激地收到!

更新:在John Sheehan的回覆(下面)中鏈接的文章確實有效 - 但如果您想使用AJAX調用Web服務,則無法工作。有人知道AJAX友好版本嗎?

+0

您能否告訴我們Ajax的問題​​是什麼? – ryber 2010-01-04 23:37:36

+0

對不起 - 現在不記得了:o( – 2010-01-06 10:35:01

回答

-8

簡短的回答是否定的。 ASMX是任何Web服務的入口點。如果您使用WCF,還有其他選擇,但這並不完全相同。

+0

對不起,你不喜歡答案,但它是答案。 – Chris 2008-11-27 21:46:48

+2

除了沒有。你可以把Web服務放在類庫中並通過網絡連接起來。 config. – 2008-11-28 02:16:04

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

0

考慮嘗試頁面方法(see this blog post)。您所要做的就是將web方法屬性添加到後面的aspx代碼中的靜態方法中。然後從客戶端代碼訪問PageMethod對象(javascript)。不需要ASMX文件。希望這可以幫助。

3

我知道這是很老的問題,但它沒有正確回答,所以在這裏它是:

每* .ASMX請求是違約System.Web.Services.Protocols.WebServiceHandlerFactory處理。

在.NET反射器中查看此類的源代碼,可以使用沒有ASMX文件的webservice,但您需要通過反射調用內部方法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(上下文)

完成。沒有ASMX和沒有web.config條目。