[c#] 도트 문자 ‘.’ MVC Web API 2에서 api / people / STAFF.45287과 같은 요청

내가 작동하도록하려는 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.

다음을 설정했습니다.

  1. 컨트롤러 “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);
    }    
    
  2. 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.0path속성 은 (예를 들어) *와 반대로 설정되어 *.있습니다.


답변

나는이 상황에 갇혀 있었지만 /
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>