URL-адрес, который я пытаюсь разрешить работать, имеет вид: http://somedomain.com/api/people/staff.33311 (точно так же, как сайты, такие как LAST.FM, разрешают всевозможные знаки в своих URL-адресах RESTFul и WebPage. , например " http://www.last.fm/artist/psy'aviah " - действительный URL-адрес для LAST.FM).
Работают следующие сценарии: - http://somedomain.com/api/people/ - который возвращает всех людей - http://somedomain.com/api/people/staff33311 - также будет работать, но это не то, что я ' m после того, как я хочу, чтобы URL-адрес принимал «точку», как в примере ниже - http://somedomain.com/api/people/staff.33311 - но это дает мне
HTTP Error 404.0 - Not Found
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.
Я установил следующее:
Контроллер PeopleController
public IEnumerable<Person> GetAllPeople() { return _people; } public IHttpActionResult GetPerson(string id) { var person = _people.FirstOrDefault(p => p.Id.ToLower().Equals(id.ToLower())); if (person == null) return NotFound(); return Ok(person); }
Файл WebApiConfig.cs
public static void Register(HttpConfiguration config) { // Web API configuration and services // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); }
Я уже пробовал следовать всем советам этого сообщения в блоге http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx, но он все равно не сработает .. Я также думаю, что это довольно утомительно, и мне интересно, нет ли другого, лучший и более безопасный способ.
У нас есть внутренний идентификатор, подобный этому, поэтому нам нужно будет найти решение, чтобы так или иначе уместить точку, предпочтительно в стиле "." но при необходимости я открыт для альтернативных предложений по URL ...
Ответы:
Следующие настройки в вашем
web.config
файле должны решить вашу проблему:источник
Добавьте к URL-адресу косую черту, например,
http://somedomain.com/api/people/staff.33311/
вместоhttp://somedomain.com/api/people/staff.33311
.источник
google.com/my query goes here/
VS.google.com/subDomain my query goes here
.Я обнаружил, что добавление следующего до стандарта
ExtensionlessUrlHandler
решает проблему для меня:Я не думаю, что имя на самом деле имеет такое большое значение, за исключением того, что оно, вероятно, помогает, если ваша IDE (в моем случае Visual Studio) управляет конфигурацией вашего сайта.
H / T на https://stackoverflow.com/a/15802305/264628
источник
Я не знаю, что делаю на самом деле, но немного поиграв с предыдущим ответом, я придумал другое, возможно, более подходящее решение:
источник
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="managedHandler" />
Я обнаружил, что мне нужно сделать больше, чем просто установить для
runAllManagedModulesForAllRequests
атрибута значениеtrue
. Я также должен был убедиться, что обработчик URL-адресов без расширений настроен на просмотр всех путей. Кроме того, вы можете добавить еще одну настройку конфигурации бонусов, которая в некоторых случаях поможет. Вот мой рабочий Web.config:Обратите внимание, в частности, что
ExtensionlessUrlHandler-Integrated-4.0
имеет свойpath
набор атрибутов , чтобы*
в отличие от*.
(например).источник
path="*."
. Просто любопытно, по какой причине люди это устанавливаютpath="*."
?path="*"
и у меня возникла проблема, потому что мы размещаем сайт документации рядом с нашим WebAPI, и у этого сайта были проблемы с .jpg, .png и другими файлами с расширениями.<modules runAllManagedModulesForAllRequests="true" />
? Это должно заставить .NET обрабатывать эти статические файлы.Я застрял в этой ситуации, но добавление
/
в конце URL-адреса было для меня не очень удобным.так что просто добавьте ниже в тег web.config,
handlers
и все будет хорошо.источник
Я обнаружил, что у меня работают оба способа: либо установить для runAllManagedModulesForAllRequests значение true, либо добавить ExtentionlessUrlHandler следующим образом. Наконец, я решил добавить extensionUrLHandler, поскольку runAllManagedModulesForAllRequests действительно влияет на производительность сайта.
источник
Я бы использовал это в файле Web.config:
раньше стандартного ExtensionlessUrlHandler.
Например, в моем случае я поместил это здесь:
Таким образом, вы заставляете управлять URL-адресами такого шаблона, а не стандартным управлением как файлами в дереве каталогов приложения.
источник
Я столкнулся с той же проблемой и с обстоятельствами, в которых я был не должен играть с IIS и настройками, связанными с конфигурацией веб-сайта. Поэтому мне пришлось заставить его работать, внося изменения только на уровне кода.
Простой момент заключается в том, что наиболее распространенный случай, когда у вас будет точка в URL-адресе, - это когда вы получаете некоторый ввод от пользователя и передаете его в виде строки запроса или фрагмента URL-адреса для передачи некоторого аргумента параметрам в методе действия. вашего контроллера.
Взгляните на приведенный ниже URL-адрес, где пользователь вводит свой идентификатор пользователя, чтобы получить свои личные данные:
Поскольку вам нужно просто получить некоторые данные с сервера, мы используем команду http
GET
. При использованииGET
вызовов любые входные параметры можно передавать только во фрагментах URL.Итак, чтобы решить мою проблему, я изменил http-глагол своего действия на
POST
.POST
Глагол Http также может передавать любой пользовательский или не пользовательский ввод в теле. Итак, я создал данные JSON и передал их в тело http-POST
запроса:Измените определение вашего метода, как показано ниже:
Примечание : Более того, когда использовать
GET
глагол и когда использоватьPOST
глагол здесь .источник