내가 작동하도록하려는 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)가 사이트 구성을 관리하는 경우 도움이된다는 점을 제외하면 이름이 실제로 그다지 중요하지 않다고 생각합니다.
H / T에서 https://stackoverflow.com/a/15802305/264628
답변
나는 내가 실제로 무엇을하고 있는지 모르겠지만 이전 답변을 조금 사용한 후에 다른 아마도 더 적절한 해결책을 찾았습니다.
<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>