Каковы правила для путей httpHandler в ASP.NET? - PullRequest
0 голосов
/ 05 июня 2009

Есть ли хороший ресурс для правил о том, как используется свойство пути httpHandler?

Я вижу смешанные результаты, когда мой обработчик вызывается в разных средах, поэтому позвольте мне объяснить ...

Я хочу разрешить URL, например:

http://mysite/_layouts/myCompany/rest/myservice.svc/param1/param2

Я бы хотел вызывать мой обработчик только в папке / ссылке myCompany, чтобы я поместил следующий файл web.config в соответствующую папку, чтобы не влиять на остальную часть приложения. Это работает на некоторых машинах, но не на других:

<configuration>
    <system.web>
        <httpHandlers>
            <add verb="*" path="myservice.svc" type="..." validate="false"/>
        </httpHandlers>
    </system.web>
</configuration>

Теперь я должен признать, что был немного удивлен, что это сработало, так как в основном он должен был найти "myservice.svc" из относительного пути rest / myservice.svc / param1 / param2, но это действительно находило это - но только на двух из моих трех испытательных машин. Итак, я попробовал следующее на компьютере, на котором произошел сбой:

<add verb"*" path="rest/myservice.svc/*/*" type="..." validate="false"/>

Это сработало несколько раз и теперь не работает. Будучи логическим типом, меня действительно беспокоит, что после некоторого усердия я не могу это объяснить, но я не смог заставить его снова работать. См. Также этот аналогичный вопрос переполнения стека.

Обратите внимание, что следующее работает, но заставляет меня обращаться к строковым переменным запроса, чтобы предоставить параметры, которые не идеальны.

<add verb"*" path="rest/myservice.svc/*" type="..." validate="false"/>

Я изучал родительские файлы web.config на двух машинах, которые дают разные результаты, чтобы увидеть, как они определяют любые httpHandlers, и ничего не выскочило как проблема.

Итак, я ищу понимание того, как используется этот путь.

Что бы это ни стоило, это выполняется на сайте SharePoint (отсюда и тег «sharepoint» в этом вопросе), и я использую его для предоставления REST (простой «text / xml») вместо SOAP. Я не хочу использовать полноценный WCF, потому что это приводит к слишком большой нагрузке на многие установки SharePoint, поэтому вместо этого я использую HTTP-обработчик.

Кроме того, я получаю следующую ошибку:

virtualPath   at System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result) 
   at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) 
   at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication context, Boolean flowContext) 
   at System.ServiceModel.Activation.HttpHandler.ProcessRequest(HttpContext context) 
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

1 Ответ

0 голосов
/ 06 июня 2009

Ответ все еще приветствуется, но здесь я нашел простой обходной путь. Настолько просто это беспокоит меня, что я не думал об этом раньше ...

Поскольку у меня есть папка / URL с определенной точки, я могу просто убедиться, что все проходит через мой обработчик:

<add verb"*" path="*" type="..." validate="false"/>

Насколько просто это получить: -S.

Дополнительным преимуществом этого является то, что я могу лучше сообщить об ошибке для неправильных URL-адресов. Я могу решить использовать фабрику обработчиков вместо обработчиков; тогда единственное изменение - это тип , который указан.

...