Указание точного пути к моему ASP.NET Http Handler - PullRequest
4 голосов
/ 31 марта 2009

Я генерирую карту сайта XML / Google на лету, используя Http Handler, так что мне не нужно поддерживать XML-файл вручную.

Я сопоставил свой обработчик Http с "sitemap.xml" в моем файле web.config следующим образом:

<httpHandlers>
  <add verb="*" path="sitemap.xml" type="My.Name.Space, MyAssembly" />
</httpHandlers>

Хорошо работает. Теперь www.mywebsite.com/sitemap.xml приводит в действие мой обработчик Http и выполняет именно то, что я хочу. Однако этот URL будет делать то же самое: www.mywebsite.com/some/folder/sitemap.xml, и я на самом деле не хочу этого, т.е. я просто хочу сопоставить свой обработчик с корнем моего приложения.

Я попытался изменить "путь" моего обработчика в файле web.config на "/sitemap.xml" и "~ / sitemap.xml", но ни один из них не работает.

Я что-то здесь упускаю?

Ответы [ 4 ]

5 голосов
/ 31 марта 2009

Попробуйте добавить следующее в ваш web.config

<urlMappings enabled="true">
    <add url="~/SiteMap.xml" mappedUrl="~/MyHandler.ashx"/>
</urlMappings>

При этом используется малоизвестная функция ASP.NET 2.0 под названием 'Url Mapping'

1 голос
/ 01 сентября 2009

Исходя из предложенного Киртаном решения # 1, вы можете сделать обходной путь следующим образом:

public void ProcessRequest(HttpContext context) {
  //Ensure that the sitemap.xml request is to the root of the application
  if (!context.Request.PhysicalPath.Equals(Server.MapPath("~/sitemap.xml"))) {
     //Invoke the Default Handler for this Request
     context.RemapHandler(null);
  }

  //Generate the Sitemap
}

Возможно, вам придется немного поиграть с этим, если вы не уверены, что вызов обработчика по умолчанию просто заставит IIS снова вызвать ваш обработчик. Вероятно, стоит протестировать в режиме отладки от VS. Если это просто повторный вызов, вам нужно попытаться вызвать статический обработчик файлов, или вы можете просто выдать HTTP 404 самостоятельно, например

//Issue a HTTP 404
context.Response.Clear();
context.Response.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
return;

См. Документацию MSDN по HttpContext.RemapHandler для получения дополнительной информации - http://msdn.microsoft.com/en-us/library/system.web.httpcontext.remaphandler.aspx

0 голосов
/ 04 января 2011

Вы также можете запустить проверку в global.asax, проверить запрос и, наконец, переназначить новый обработчик через метод context.RemapHandler.
Единственное, что вы могли бы реализовать на этом заводе.

Я бы посоветовал вам наследовать HttpApplication и реализовать там фабрику, но это ваш вызов.

0 голосов
/ 31 марта 2009

2 решения для этого:

Soln # 1: Вы можете проверить путь запроса, используя свойство Request.Url, если запрос от корневого пути, вы можете сгенерировать XML, иначе ничего не делать.

Soln # 2: Поместите файл web.config со следующими параметрами в каждую папку, в которой вы не хотите обрабатывать запрос файла sitemap.xml.

...