Я искал способ направить 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.
Вам нужно вернуть объект, реализующий IHttpHandler, который позаботится о вашем запросе.
Вы можете посмотреть эту статью о том, как реализовать веб-сервис, используя этот интерфейс: http://mikehadlow.blogspot.com/2007/03/writing-raw-web-service-using.html
Но это, вероятно, ближе к тому, что вам нужно http://forums.asp.net/p/1013552/1357951.aspx (Есть ссылка, но она требует регистрации, поэтому я не проверял)
Это для всех, кто хочет сделать то же самое. Мне было невероятно сложно найти информацию.
В GetHttpHandler (byVal requestContext как RequestContext) как IHttpHandler реализует метод 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 сказано, что 3-м параметром должен быть RawURL, передача HttpContext.Current.Request.RawURL не работает, но вместо этого передача виртуального пути к файлу .asmx отлично работает.
Я использую эту функцию, чтобы мой веб-сервис мог быть вызван любым настроенным веб-сайтом (даже виртуальным каталогом), который указывает (в IIS) на мое приложение, может вызывать веб-службу приложения, используя что-то вроде " http: // url / virtualdirectory / somethingelse / WebService ", и маршрутизация всегда будет направлять его в мой файл .asmx.