Asp.Net 3.5 Маршрутизация на веб-сервис? - PullRequest
7 голосов
/ 08 апреля 2010

Я искал способ маршрутизации http://www.example.com/WebService.asmx на http://www.example.com/service/ с использованием только инфраструктуры маршрутизации ASP.NET 3.5 без необходимости настройки сервера IIS.

До сих пор я делал то, что говорилось в большинстве уроков, добавил ссылку на сборку маршрутизации, настроил материал в 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())
    );
}

... создал этот класс:

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

... и проблема тут, Я не знаю, что делать . Учебники и руководства, которые я прочитал, используют маршрутизацию для страниц, а не веб-сервисов. Это вообще возможно?

Ps : обработчик маршрута работает, я могу посетить / service / и он выдает NotImplementedException Я оставил в GetHttpHandler метод.

Ответы [ 3 ]

8 голосов
/ 21 декабря 2010

Просто подумал, что я завершу этот вопрос более подробным решением, основанным на ответе, который мне дал Маркивес.

Во-первых, это класс обработчика маршрута, который передает виртуальный каталог в ваш 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")));
2 голосов
/ 10 июня 2010

Это для всех, кто хочет сделать выше. Мне было невероятно трудно найти информацию.

В методе GetHttpHandler(byVal requestContext as RequestContext) as IHttpHandler Implements IRouteHandler.GetHttpHandler (моя версия выше)

Кстати, для Webforms 3.5 (у меня в VB).

Вы не можете использовать обычный метод BuildManager.CreateInstanceFromVirtualPath () для вызова вашего веб-сервиса, который предназначен только для тех вещей, которые реализуют iHttpHandler, а .asmx - нет. Вместо этого вам необходимо:

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

Документация MSDN гласит, что третьим параметром должен быть RawURL, передача HttpContext.Current.Request.RawURL не работает, но вместо этого отлично работает передача виртуального пути в файл .asmx.

Я использую эту функцию, чтобы мой веб-сервис мог вызываться любым веб-сайтом, настроенным в любом случае (даже виртуальным каталогом), который указывает (в IIS) на то, что мое приложение может вызывать веб-сервис приложения, используя что-то вроде "http://url/virtualdirectory/anythingelse/WebService" и маршрутизация всегда будет направлять это в мой файл .asmx.

1 голос
/ 12 апреля 2010

Вам необходимо вернуть объект, который реализует IHttpHandler, который позаботится о вашем запросе.

Вы можете ознакомиться с этой статьей о том, как реализовать веб-сервис с использованием этого интерфейса: http://mikehadlow.blogspot.com/2007/03/writing-raw-web-service-using.html

Но это, вероятно, ближе к тому, что вы хотите http://forums.asp.net/p/1013552/1357951.aspx (ссылка есть, но требует регистрации, поэтому я не тестировал)

...