내가 작동하도록하려는 URL은 http://somedomain.com/api/people/staff.33311 스타일 중 하나입니다 (LAST.FM과 같은 사이트는 RESTFul 및 웹 페이지 URL에 모든 종류의 표시를 허용하는 것과 같습니다). 예를 들어 ” http://www.last.fm/artist/psy’aviah “는 LAST.FM의 유효한 URL입니다.)
작동하는 시나리오는 다음과 같습니다.- 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 의 모든 팁을 따르려고 시도 했지만 여전히 작동하지 않습니다. 더 좋고 안전한 방법입니다.
우리는 내부적으로 이와 같은 ID를 가지고 있으므로 점을 어떤 식 으로든, 가급적이면 “.”스타일로 맞추기위한 해결책을 찾아야합니다. 하지만 필요한 경우 URL에 대한 대체 제안에 열려 있습니다.
답변
web.config
파일 에서 다음 설정을 사용 하면 문제가 해결됩니다.
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
답변
예를 들어 http://somedomain.com/api/people/staff.33311/
대신 슬래시로 URL을 추가합니다 http://somedomain.com/api/people/staff.33311
.
답변
표준 전에 다음 을 추가 하면 문제가 해결 된다는 것을 알았 습니다.ExtensionlessUrlHandler
<add name="ExtensionlessUrlHandler-Integrated-4.0-ForApi"
path="api/*"
verb="*"
type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0" />
IDE (제 경우에는 Visual Studio)가 사이트 구성을 관리하는 경우 도움이된다는 점을 제외하면 이름이 실제로 그다지 중요하지 않다고 생각합니다.
답변
나는 내가 실제로 무엇을하고 있는지 모르겠지만 이전 답변을 조금 사용한 후에 다른 아마도 더 적절한 해결책을 찾았습니다.
<system.webServer>
<modules>
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
</modules>
</system.webServer>
답변
runAllManagedModulesForAllRequests
속성을로 설정하는 것 이상의 작업이 필요하다는 것을 알았 습니다 true
. 또한 확장없는 URL 처리기가 모든 경로를 보도록 구성되었는지 확인해야했습니다. 또한 추가 할 수있는 추가 구성 설정이 하나 더 있습니다. 이는 경우에 따라 도움이됩니다. 내 작업 Web.config는 다음과 같습니다.
<system.web>
<httpRuntime relaxedUrlToFileSystemMapping="true" />
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<remove name="WebDAV" />
<remove name="OPTIONSVerbHandler" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
특히 ExtensionlessUrlHandler-Integrated-4.0
의 path
속성 은 (예를 들어) *
와 반대로 설정되어 *.
있습니다.
답변
나는이 상황에 갇혀 있었지만 /
URL 끝에 추가 하는 것이 깨끗해 보이지 않았습니다.
따라서 web.config handlers
태그 에 아래에 추가하기 만하면 됩니다.
<add name="Nancy" path="api" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" allowPathInfo="true" />
답변
두 가지 방법 모두 나를 위해 작동한다는 것을 알았습니다. runAllManagedModulesForAllRequests를 true로 설정하거나 ExtentionlessUrlHandler를 다음과 같이 추가하십시오. 마지막으로 runAllManagedModulesForAllRequests가 사이트에 성능 영향을 미치기 때문에 extensionUrLHandler를 추가하기로 선택합니다.
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<remove name="WebDAV" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*" verb="*"
type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>