2009-06-20 5 views
4

J'ai vu comment vous pouvez ajouter des routes personnalisées à WebForms en utilisant du code comme celui-ci.Puis-je router une URL pour un service Web (ASMX) sur un site ASP.NET MVC?

public class WebFormsRouteHandler : IRouteHandler 
{ 
    public string VirtualPath { get; set; } 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     // Compiles ASPX (if needed) and instantiates the web form 
     return (IHttpHandler) BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof (IHttpHandler)); 
    } 
} 

Je suis en train de faire quelque chose de semblable au travail, mais pour les fichiers de service Web (TestService.asmx.) Cette méthode précédente jette une exception parce que la page ne hérite pas de IHttpHandler. Je l'ai vu un autre code qui utilise le WebServiceHandlerFactory comme celui-ci

return new WebServiceHandlerFactory().GetHandler(context, requestType, url, pathTranslated); 

qui retourne un IHttpHandler comme je l'ai besoin, mais il a besoin d'un HttpContext passé dans mais la seule chose que j'ai accès aussi dans le cadre de RequestContext est un HttpContextBase. De ce que je peux dire, je ne peux pas convertir en HttpContext à partir de ça.

Des idées? Ou peut-être une façon différente de s'y prendre? Ce que j'essaie d'accomplir, c'est de contrôler les URL de mes services Web via le système de routage normal. Un exemple veut que TestService.asmx apparaisse comme ExampleTestService /.

Répondre

1

Idée intéressante. Je ne savais pas que vous pourriez utiliser des formulaires Web de cette façon. Nous intégrons actuellement les anciennes applications de formulaire Web avec IgnoreRoutes. Je vais certainement marquer votre question;)

Mais peut-être que je peux vous aider avec votre problème. Le bon vieux HttpContext existe toujours, il est juste enveloppé par MVC dans le simulé HttpContextBase.

Vous pouvez récupérer le HttpContext original avec

var context = System.Web.HttpContext.Current; 

Dans un contrôleur, vous devez spécifier le type complètement pour le distinguer de la propriété du contrôleur appelé HttpContext

+0

J'obtiens un succès partiel avec ceci. Je peux obtenir mon URL personnalisée pour afficher le service Web, mais cela échoue lorsque j'essaie de l'invoquer. –

+0

Ensuite, votre meilleure chance est de déboguer à travers le code ASP.NET au point où si échoue et découvrez pourquoi ... – chris166

1

Voici comment je le fais:

Return New WebServiceHandlerFactory().GetHandler(HttpContext.Current, "*", "/Build/WebService.asmx", HttpContext.Current.Server.MapPath(aspxToLoad)) 
+0

Cha-ching! Merci, Markive! – pettys

Questions connexes