2010-04-08 18 views
7

http://www.example.com/WebService.asmx - http://www.example.com/service/ numaralı adrese, IIS sunucusunu yapılandırmaya gerek kalmadan yalnızca ASP.NET 3.5 Yönlendirme altyapısını kullanarak bir yol arıyordum.Asp.Net 3.5 Web servisine yönlendirme?

Şimdiye kadar çoğu öğreticiler, bana web.config şeyler yapılandırılan yönlendirme derlemesine ilave, Global.asax bu katma şeyi yaptı:

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

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

.. Bu sınıf Düzenlendi:

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

... ve problem ben ne yapacağını bilmiyorum , hemen orada. Öğreticiler ve kılavuzlar, webservices değil, sayfalar için yönlendirme kullandım. Bu mümkün mü?

Ps

: rota işleyicisi çalışıyor, ben /hizmet/ ziyaret edebilir ve ben GetHttpHandler yönteminde sol NotImplementedException atar.

cevap

8

Bu soruyu, benim için çalışan Markives'in vermiş olduğu cevaba dayanan ayrıntılı bir çözümle bitirmeyi düşündüm.

Öncelikle sanal dizini yapıcı param olarak WebService'inize alan yol işleyici sınıfı.

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)); 
    } 
} 

ve Global.asax

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

kötü routey bit içinde bu sınıfın fiili kullanımı. Mükemmel çalışıyor. teşekkür ederim. – b0x0rz

+0

Günümü kurtardım! Teşekkür ederim! –

+2

Yöntemleri nasıl eşleştireceğiniz hakkında bir fikriniz var mı? Yani /Services/SoapQuery.asmx/HelloWorld yerine,/Services/SoapQuery/HelloWorld –

2

Yukarıdakileri yapmak isteyen herkes içindir. Bilgiyi bulmak çok zor buldum. GetHttpHandler(byVal requestContext as RequestContext) as IHttpHandler Implements IRouteHandler.GetHttpHandler yöntemi (yukarıda benim sürümü) olarak

Bu şekilde (maden VB var) tarafından Webforms 3.5 içindir.

Her zamanki BuildManager.CreateInstanceFromVirtualPath() yöntemini kullanamazsınız, bu yalnızca iHttpHandler uygulamasının gerçekleştirdiği şeyler içindir. Bunun yerine yapmanız gerekenler:

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

MSDN belgelerine 3 parametre yerine işleri HttpContext.Current.Request.RawURL çalışmıyor geçen değil .asmx dosyaya sanal yol geçirmeden RawURL olması gerektiğini söyler harika.

Bu işlevi, web servisimin herhangi bir Web sitesi tarafından çağrılabilsin diye herhangi bir Web sitesi (örneğin, bir sanal dizin) tarafından çağrılabilir, böylece uyguladığım uygulamaya (IIS) uygulama web hizmetini "http://url/virtualdirectory/anythingelse/WebService" gibi bir şey kullanarak uygulama web hizmetini çağırabilir. yönlendirme her zaman bu .asmx dosyama yönlendirir.