Desidero selezionare un'azione del mio controller in base al tipo di supporto richiesto nell'intestazione Accept.È possibile selezionare un'azione con AttributeRouting in .NET MVC in base al tipo di supporto dell'intestazione Accept?
Ad esempio, ho una risorsa denominata oggetto. Il suo percorso è assegnato:
GET/soggetti/{subjectId: int}
Normalmente, il browser richiede text/html
, che va bene. Il formattatore multimediale predefinito gestisce questo fantastico.
Ora, ho una logica personalizzata che desidero eseguire quando si accede a questa stessa rotta con un'intestazione di accettazione che specifica application/pdf
come tipo di supporto accettato.
Potrei creare un Media Formatter personalizzato, ma, a mio parere, ciò significherebbe che qualsiasi percorso richiesto con l'intestazione Accept impostata su application/pdf
verrà eseguito anche attraverso questo Media Formatter. Questo è inaccettabile.
In Java, v'è un'annotazione chiamato @Produces
:
L'annotazione @Produces viene utilizzato per specificare i tipi di media MIME o rappresentazioni una risorsa in grado di produrre e inviare al client. Se @Produces viene applicato a livello di classe, tutti i metodi in una risorsa possono produrre i tipi MIME specificati per impostazione predefinita. Se applicato al livello del metodo , l'annotazione sovrascrive qualsiasi annotazione @Produces applicata a livello di classe.
Ciò mi permette di fare quanto segue:
namespace MyNamespace
{
[RoutePrefix("subjects")]
public class SubjectsController : Controller
{
[Route("{subjectId:int}")]
[HttpGet]
public ActionResult GetSubject(int subjectId)
{
}
[Route("{subjectId:int}")]
[HttpGet]
[Produces("application/pdf")]
public ActionResult GetSubjectAsPdf(int subjectId)
{
//Run my custom logic here to generate a PDF.
}
}
}
Non c'è Produce attributi in .NET che posso trovare, naturalmente, quindi questo non funziona. Non sono neanche riuscito a trovare un attributo simile.
Potrei ovviamente controllare manualmente l'intestazione all'interno del corpo dell'azione, e reindirizzare a un'altra azione, ma che sembra hackish al meglio.
Esiste un meccanismo in .NET 4.5 che possa essere utilizzato per escludere ciò che trascuro o manca?
(sto usando MVC 5.2.2 dal repository NuGet)
Sembra possibile utilizzare un selettore di controller personalizzato: http: // stackoverflow.it/questions/25941590/asp-net-mvc-intercettazione-routing-e-forward-to-different-actions-routes – mostruash
@mostruash Non sembra che un selettore di controller sia quello che voglio, ma mi ha fatto iniziare a cercare in selettori di azioni, che sono simili. Scoverò e vedrò se riesco a capirlo. – crush
Ora sto pensando che potrei potenzialmente utilizzare un vincolo di instradamento su questo, ma non ne sono ancora sicuro. – crush