O URL que estou tentando deixar funcionar é no estilo de: http://somedomain.com/api/people/staff.33311 (assim como sites como LAST.FM permitem todos os tipos de sinais em seus URLs RESTFul e WebPage , por exemplo " http://www.last.fm/artist/psy'aviah " é um url válido para LAST.FM).
O que funciona são os seguintes cenários: - http://somedomain.com/api/people/ - que retorna todas as pessoas - http://somedomain.com/api/people/staff33311 - funcionaria bem, mas não é o que eu ' m depois de querer que o url aceite um "ponto", como no exemplo abaixo - http://somedomain.com/api/people/staff.33311 - mas isso me dá um
HTTP Error 404.0 - Not Found
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.
Eu configurei as seguintes coisas:
O controlador "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); }
O 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 } ); }
Já tentei seguir todas as dicas desta postagem do blog http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx, mas ainda não funcionou .. Também acho que é bastante entediante e me pergunto se não há outro, maneira melhor e mais segura.
Temos nossos IDs internamente assim, então vamos ter que encontrar uma solução para encaixar o ponto de uma forma ou de outra, de preferência no estilo "." mas estou aberto a sugestões alternativas de urls, se necessário ...
fonte
Respostas:
A configuração a seguir em seu
web.config
arquivo deve resolver o problema:fonte
Sufixe o URL com uma barra, por exemplo, em
http://somedomain.com/api/people/staff.33311/
vez dehttp://somedomain.com/api/people/staff.33311
.fonte
google.com/my query goes here/
vgoogle.com/subDomain my query goes here
.Descobri que adicionar o seguinte antes do padrão
ExtensionlessUrlHandler
resolve o problema para mim:Não acho que o nome realmente importe tanto, exceto que provavelmente ajuda se o seu IDE (Visual Studio no meu caso) estiver gerenciando a configuração do seu site.
H / T para https://stackoverflow.com/a/15802305/264628
fonte
Não sei realmente o que estou fazendo, mas depois de brincar um pouco com a resposta anterior, encontrei outra solução, talvez mais apropriada:
fonte
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="managedHandler" />
Descobri que precisava fazer mais do que apenas definir o
runAllManagedModulesForAllRequests
atributo comotrue
. Eu também tive que garantir que o manipulador de URL sem extensão foi configurado para examinar todos os caminhos. Além disso, há mais uma definição de configuração de bônus que você pode adicionar que ajudará em alguns casos. Aqui está meu Web.config funcional:Observe, especificamente, que o
ExtensionlessUrlHandler-Integrated-4.0
tem seupath
atributo definido*
como em oposição a*.
(por exemplo).fonte
path="*."
. Só por curiosidade, qual é o motivo pelo qual as pessoas definem issopath="*."
?path="*"
e tive um problema porque hospedamos um site de documentação lado a lado com nosso WebAPI e esse site tinha problemas com .jpg, .png e outros arquivos com extensões.<modules runAllManagedModulesForAllRequests="true" />
? Isso deve fazer o .NET lidar com esses arquivos estáticos.Fiquei preso nesta situação, mas anexar
/
no final do URL não parecia limpo para mim.então, basta adicionar a tag web.config abaixo
handlers
e você estará pronto para prosseguir.fonte
Descobri que as duas formas funcionam para mim: definir runAllManagedModulesForAllRequests como true ou adicionar ExtentionlessUrlHandler como segue. Por fim, escolho adicionar extensionUrLHandler, pois runAllManagedModulesForAllRequests tem impacto no desempenho do site.
fonte
Eu usaria isso no arquivo Web.config:
antes do "ExtensionlessUrlHandler" padrão.
Por exemplo, no meu caso, coloquei aqui:
Portanto, você força URLs de tal padrão a serem gerenciados por você, em vez do gerenciamento padrão como arquivos na árvore de diretório do aplicativo.
fonte
Eu enfrentei exatamente o mesmo problema e as circunstâncias em que eu não deveria brincar com o IIS e configurações relacionadas à configuração do site. Então eu tive que fazer isso funcionar fazendo alterações apenas no nível do código.
O ponto simples é que o caso mais comum em que você acabaria tendo um caractere ponto no URL é quando você obtém alguma entrada do usuário e a passa como uma string de consulta ou fragmento de url para passar algum argumento para os parâmetros no método de ação do seu controlador.
Dê uma olhada no URL abaixo onde o usuário insere seu ID de usuário para obter seus dados pessoais:
Uma vez que você tem que simplesmente buscar alguns dados do servidor, usamos o
GET
verbo http . Durante o uso deGET
chamadas, qualquer parâmetro de entrada pode ser passado apenas nos fragmentos de URL.Então, para resolver meu problema, mudei o verbo http da minha ação para
POST
. OPOST
verbo HTTP tem a facilidade de transmitir qualquer entrada de usuário ou não usuário no corpo também. Portanto, criei um dado JSON e o passei para o corpo daPOST
solicitação http :Altere a definição do seu método conforme abaixo:
Nota : Mais sobre quando usar
GET
verbo e quando usarPOST
verbo aqui .fonte