WSE представляет два новых класса, имплементирующих
IHttpHandler :
SoapHttpRouter и
SoapReceiver. Как и любые другие реализации IHttpHandler, эти добавляются в ASP.NET-приложение секцией в в <system.web>, как например:
<system.web>
<httpHandlers>
<add type="namespace.myHttpHandler, assemblyName" path="*.ashx" verb="*" />
</httpHandlers>
...
</system.web>
при этом, если приложение настроено для WSE, то WseCongigEditor узнает такую конфигурацию :
[528x594]
Это, конечно, означает, что вне зависимости от чего наследует ваш handler - от SoapReciver или от SoapHttpRouter - он будет вызван при любом запросе сервера через ashx, т.е. во всех трёх случаях ваш handler может переадресовывать сообщения, только вот из разных методов, зависящих от реализации.
Имплементация |
Метод |
|---|
1. |
IHttpHandler |
public void ProcessRequest(HttpContext ctx) |
2. |
SoapHttpRouter |
protected override Uri ProcessRequestMessage(SoapEnvelope message) |
3. |
SoapReceiver |
protected override void Receive (Microsoft.Web.Services2.SoapEnvelope envelope) |
Следующий вопрос, поэтому, как переадресовывать. В первом случае, имея дело только с HttpContext, это выглядит довольно проблематично, и уже поэтому, реализация раутера прямым наследованием от IHttpHandler не будет рассматриваться. Переадресация из SoapHttpRouter - это именно то, что делает встроенный в WSE Messaging.SoapHttpRouter, так что вряд ли его стоит повторять : читаем ReferralCache.config и возвращаем из ProcessRequestMessage() новый Uri - вот и весь раутинг для http, но так и наследуемый класс и называется SoapHttpRouter!
Итак, исталось наиболее интересное : SoapReceiver.Receive().