문제

게시물 방법의 경우 W3 사양은 다음과 같이 말합니다.

원래 서버에서 리소스가 생성 된 경우 응답은 201 (생성) 여야하며 요청의 상태를 설명하고 새 리소스와 위치 헤더를 나타내는 엔티티가 포함되어야합니다 (섹션 10.4 참조).

http://www.ietf.org/internet-drafts/draft-ietf-httpbis-p2-semantics-05.txt (섹션 8.5)

표준 응답은 실제로 새로 생성 된 리소스로 리디렉션을 보내는 것 같습니다.

ASP.NET MVC로 사이트를 구축하고 사양을 따라 가려고 했으므로 ResourceCreatedResult 수업:

public class ResourceCreatedResult : ActionResult
{
    public string Location { get; set; }
    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.Clear();
        context.HttpContext.Response.StatusCode = 201;
        context.HttpContext.Response.ClearHeaders();
        context.HttpContext.Response.AddHeader("Location", Location);
    }
}

그리고 내 행동은 다음과 같이 보입니다.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreateNew(string entityStuff)
{
    Entity newEntity = new Entity(entityStuff);
    IEntityRepository entityRepository = ObjectFactory.GetInstance<IEntityRepository>();
    entityRepository.Add(newEntity);

    ActionResult result = new ResourceCreatedResult()
        { Location = Url.Action("Show", new { id = newEntity.Id }) };
    return result;
}

그러나 즉, Firefox 및 Chrome은 모두 새로운 리소스로 리디렉션되지 않습니다. 올바른 응답을 엉망으로 만들었거나 웹 브라우저가 이러한 유형의 응답을 기대하지 않고 서버에 의존하여 리디렉션 응답을 보내는가?

도움이 되었습니까?

해결책

Post 또는 Post/Redirect/Get 후 리디렉션은 응용 프로그램이 사용자 친화적이어야하는 일입니다.

편집하다. 이것은 HTTP 사양 이상입니다. 게시물 후 단순히 201을 반환하면 브라우저 뒤로 버튼이 심하게 작동합니다.

웹 서비스 요청 (브라우저에 응답하지 않음)은 표준을 완전히 따르고 게시 후 리디렉션되지 않습니다.

이와 같이 작동합니다.

  1. 브라우저는 데이터를 게시합니다.

  2. 응용 프로그램이 데이터를 확인합니다. 유효하지 않은 경우 양식으로 응답하여 수정하고 게시 할 수 있습니다.

  3. 응용 프로그램은 리디렉션으로 응답합니다.

  4. 브라우저는 리디렉션을 가져 와서 얻습니다.

  5. 귀하의 응용 프로그램은 GET 및 응답을 볼 수 있습니다.

이제 - 헤이 프레스토! - 뒤로 버튼이 작동합니다.

다른 팁

명시 적으로, 브라우저 (Firefox 3 및 IE8과 같은 최신 브라우저 포함) HTTP 201: Created 위치 헤더에 제공된 URI에 대한 GET 요청이있는 응답.

브라우저가 위치 헤더에 제공된 URI로 이동하려면 HTTP 303: See Other 대신 상태.

내 솔루션은 새 리소스에 대한 링크가 포함 된 간단한 페이지와 location.replace ()를 사용하여 JavaScript 리디렉션을 포함하는 '201 작성'으로 응답하는 것입니다.

이를 통해 API 및 브라우저 요청에 대해 동일한 코드가 작동하고 백 및 새로 고침 버튼으로 멋지게 플레이하며 오래된 브라우저에서 우아하게 저하됩니다.

사양에 명시된 바와 같이 응답은 리디렉션이있는 HTTP 201 여야합니다. 따라서 브라우저 공급 업체가 정답을 구현 해야하는 것은 필수적이지 않습니다 ...

30x 코드로 변경하여 올바르게 리디렉션되는지 확인해야합니다. 그렇다면 브라우저 문제이므로 코드에서 나올 수 있습니다 (ASP.NET에서는 아무것도 모르므로 코드를 "검증 할 수 없습니다").

무언가가 "생성 된"경우에만 중요하지 않아야하므로 간단한 재 지정 행동으로 충분해야합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top