Сбой WebGet UriTemplate в точке ('.' /% 2E)? - PullRequest
4 голосов
/ 05 января 2012

Я уже некоторое время пытаюсь выяснить, почему этот UriTemplate не работает как часть службы WCF и, похоже, никуда не денется:

[WebGet(UriTemplate="api/1.0/version")]
string GetVersion();

Быстрый тест показывает, что UrlTemplateTable отлично ему соответствует (вывод «api / 1.0 / version»):

static void Main(string[] args)
{
    Uri prefix = new Uri("http://localhost/");
    System.UriTemplateTable table = new System.UriTemplateTable(prefix);
    table.KeyValuePairs.Add(new KeyValuePair<UriTemplate, Object>(new UriTemplate("api/1.0/version"), "a"));
    table.KeyValuePairs.Add(new KeyValuePair<UriTemplate, Object>(new UriTemplate("api/2.0/version"), "b"));
    table.KeyValuePairs.Add(new KeyValuePair<UriTemplate, Object>(new UriTemplate("api/version"), "c"));

    Uri uri = new Uri("http://localhost/api/1.0/version");
    UriTemplateMatch match = table.MatchSingle(uri);
    Console.WriteLine("{0}", match.Template.ToString());
}

Точка не является недопустимым символом в URL-адресах, RequestPathInvalidCharacters не исключает его, отсутствуют правила перезаписи, которые могли бы помешать. Ничего не могу найти в документации к нему.

Хотя существует очевидный обходной путь, не использующий точку в шаблоне, мне любопытно, почему он не работает с «HTTP 404 / ресурс не найден».

1 Ответ

3 голосов
/ 06 января 2012

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

С уважением Пабло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...