Pergunta

Para um método POST, as especificações W3 dizer:

Se um recurso foi criado no servidor de origem, a resposta Deve ser 201 (Criado) e conter uma entidade que descreve o status da solicitação e refere-se ao novo recurso, e uma localização cabeçalho (ver Secção 10.4).

http: //www.ietf. org / Internet-rascunhos / draft-IETF-httpbis-P2-semântica-05.txt (seção 8.5)

A resposta padrão realmente parece ser a de enviar um redirecionamento para o recurso recém-criado.

Estou construindo meu site com ASP.NET MVC, e tentou seguir a especificação, por isso criou uma classe 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);
    }
}

E a minha ação é algo como isto:

[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;
}

No entanto, IE, Firefox e Chrome tudo deixar de redirecionamento para o novo recurso. Tenha eu errei gerar a resposta correta, ou que navegadores da web não esperar que este tipo de resposta, em vez de confiar em servidores de enviar uma resposta de redirecionamento?

Foi útil?

Solução

Redirect após post ou post / redirecionamento / get é algo que seu aplicativo deve fazer para ser amigável.

Editar . Este é acima e além das especificações de HTTP. Se nós simplesmente retornar um 201 após um POST, o botão do navegador de volta se comporta mal.

Note que os pedidos Web Services (que não respondem a um navegador) seguem o padrão completamente e não redirecionar após post.

Ele funciona assim.

  1. Os POSTS navegador de dados.

  2. O aplicativo valida os dados. Se for inválido, você responde com a forma que eles possam corrigi-lo e POST.

  3. Seus responde aplicativo com um redirecionamento.

  4. O navegador recebe o redirecionamento e faz um GET.

  5. O aplicativo vê o GET e responde.

Agora - voilá! -. O botão funciona de volta

Outras dicas

Para ser explícito, navegadores (incluindo navegadores modernos como o Firefox 3 e IE8) não "tomar a dica" e seguem-se uma resposta HTTP 201: Created com um pedido GET para o URI fornecido no cabeçalho Localização.

Se você quiser navegadores para ir para a URI fornecido no cabeçalho Location, você deve enviar um status HTTP 303: See Other vez.

A minha solução é responder com um '201 Criado' contendo uma página simples com um link para o novo recurso, e um redirecionamento javascript usando location.replace ().

Isso permite que o mesmo código de trabalho para solicitações de API e do navegador, funciona muito bem com as costas e refrescar botões, e degrada graciosamente em navegadores antigos.

Como afirmado na especificação a resposta deve ser um HTTP 201 com redirecionamento. Portanto, não é obrigatório para um fornecedor do navegador para implementar a resposta correta ...

Você deve tentar mudar para um código de 30x para ver se ele está corretamente redirecionado. Se assim for, é um problema de navegador, então ele pode vir do seu código (eu não sei nada em ASP.NET, então eu não posso "validar" o seu código)

não deve que só contam para quando algo é "Criado" e, portanto, um simples redirecionamento para a ação deve ser realmente suficiente?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top