2015-04-02 2 views
2

Я пишу конечную точку Нэнси, и я хочу сделать что-то, что, по моему мнению, должно быть очень простым. Я хочу поддерживать возврат содержимого в json или xml, но когда html или любой другой тип запрашивается для возврата 406 Не поддерживается. Я могу легко принудительно использовать только XML или JSON, и я предполагаю, что могу это сделать, и если (accept is html) возвращает 406, но я бы предположил, что в поддержке сопровождения контента есть определенная поддержка.Только разрешить Нэнси возвращать json или Xml и 406, когда принять заголовок html

Может ли кто-нибудь проливать свет?

ответ

1

Внесите свой собственный IResponseProcessor, Нэнси возьмет его и зацепит за двигатель.

public sealed class NoJsonOrXmlProcessor : IResponseProcessor 
    { 
     public ProcessorMatch CanProcess(MediaRange requestedMediaRange, dynamic model, NancyContext context) 
     { 
      if (requestedMediaRange.Matches("application/json") || requestedMediaRange.Matches("aaplication/xml")) 
      { 
       //pass on, so the real processors can handle 
       return new ProcessorMatch{ModelResult = MatchResult.NoMatch, RequestedContentTypeResult = MatchResult.NoMatch}; 
      } 
      return new ProcessorMatch{ModelResult = MatchResult.ExactMatch, RequestedContentTypeResult = MatchResult.ExactMatch}; 
     } 

     public Response Process(MediaRange requestedMediaRange, dynamic model, NancyContext context) 
     { 
      return new Response{StatusCode = HttpStatusCode.NotAcceptable}; 
     } 

     public IEnumerable<Tuple<string, MediaRange>> ExtensionMappings { get; private set; } 
    } 
+0

Вам может понадобиться переопределить 'NancyInternalConfiguration' с вашей собственной коллекции requestprocessors, чтобы гарантировать, что это первое. –

1

Мы избегали использования ResponseProcessor по всей причине, что запрос был еще запустить весь путь через наш слой аутентификации, домен слой и т.д. Мы хотели способ быстро убить запрос как можно скорее ,

Что мы закончили делать было выполнять проверку внутри нашей собственной Boostrapper

public class Boostrapper : DefaultNancyBootstrapper 
{ 
    protected override void RequestStartup(TinyIoCContainer requestContainer, IPipelines pipelines, NancyContext context) 
    { 
     base.RequestStartup(requestContainer, pipelines, context); 

     pipelines.BeforeRequest += nancyContext => 
     { 
      RequestHeaders headers = nancyContext.Request.Headers 
      if (!IsAcceptHeadersAllowed(headers.Accept)) 
      { 
       return new Response() {StatusCode = HttpStatusCode.NotAcceptable}; 
      } 
      return null; 
     } 
    } 

    private bool IsAcceptHeadersAllowed(IEnumerable<Tuple<string, decimal>> acceptTypes) 
    { 
     return acceptTypes.Any(tuple => 
     { 
      var accept = new MediaRange(tuple.Item1); 
      return accept.Matches("application/json") || accept.Matches("application/xml"); 
     }); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^