2010-04-08 62 views
7

我正在尋找一種將http://www.example.com/WebService.asmx轉換爲http://www.example.com/service/的方法,只使用ASP.NET 3.5路由框架,而無需配置IIS服務器。Asp.Net 3.5路由到Webservice?

到現在爲止我已經做了最教程告訴我,加入了參考路由組件,在web.config配置的東西,已將此添加到Global.asax中

protected void Application_Start(object sender, EventArgs e) 
{ 
    RouteCollection routes = RouteTable.Routes; 

    routes.Add(
     "WebService", 
     new Route("service/{*Action}", new WebServiceRouteHandler()) 
    ); 
} 

.. .created這個類:

public class WebServiceRouteHandler : IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     // What now? 
    } 
} 

...,問題就在那裏,我不知道該怎麼辦。我讀過的教程和指南對頁面使用路由,而不是web服務。這甚至有可能嗎?

:路由處理程序的工作,我可以訪問/服務/並拋出NotImplementedException我留在GetHttpHandler方法。

回答

8

只是想到我會根據標記爲我工作的答案提供更詳細的解決方案來解決這個問題。

首先這裏是路由處理器類,它將虛擬目錄作爲其構造函數參數接受WebService。

public class WebServiceRouteHandler : IRouteHandler 
{ 
    private string _VirtualPath; 

    public WebServiceRouteHandler(string virtualPath) 
    { 
     _VirtualPath = virtualPath; 
    } 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     return new WebServiceHandlerFactory().GetHandler(HttpContext.Current, 
      "*", 
      _VirtualPath, 
      HttpContext.Current.Server.MapPath(_VirtualPath)); 
    } 
} 

和本類的Global.asax

routes.Add("SOAP", 
    new Route("soap", new WebServiceRouteHandler("~/Services/SoapQuery.asmx"))); 
+0

惡人routey位內的實際使用情況。完美的作品。謝謝。 – b0x0rz 2011-06-06 01:46:05

+0

拯救了我的一天!謝謝! – 2012-01-24 14:09:30

+2

關於如何映射方法的任何想法?因此,而不是/Services/SoapQuery.asmx/HelloWorld,我想要的路徑是/ Services/SoapQuery/HelloWorld – 2012-09-13 04:35:21

2

這是給任何想要完成上述操作的人。我發現很難找到這些信息。

GetHttpHandler(byVal requestContext as RequestContext) as IHttpHandler Implements IRouteHandler.GetHttpHandler方法(我的版本以上)

這是順便說一下(我是在VB)Web表單3.5。

你不能使用通常的BuildManager.CreateInstanceFromVirtualPath()方法來調用你的web服務,它只適用於實現i.HttpHandler的.asmx沒有的東西。相反,你需要:

Return New WebServiceHandlerFactory().GetHandler(
    HttpContext.Current, "*", "/VirtualPathTo/myWebService.asmx",  
    HttpContext.Current.Server.MapPath("/VirtualPathTo/MyWebService.aspx")) 

MSDN文檔說,第三個參數應該是RawURL,路過HttpContext.Current.Request.RawURL不工作,而是通過虛擬路徑.asmx文件,而不是作品大。

我使用這種功能,以便我的web服務可以被任何配置的網站(甚至虛擬目錄)調用,指向我的應用程序(在IIS中)可以調用應用程序Web服務,使用類似「http://url/virtualdirectory/anythingelse/WebService」和路由將始終將其路由到我的.asmx文件。