2016-03-10 12 views
7

Sembra che ASP.NET interpreti implicitamente il metodo denominato GetX e PostX come metodi GET e POST rispettivamente, poiché i loro nomi sono preceduti dai nomi dei metodi HTTP. Questo vale anche per PUT e DELETE.Come arrestare l'API Web ASP.NET dall'interpretazione implicita del metodo HTTP?

Ho un metodo sfortunatamente chiamato Delete ma voglio che venga interpretato come un POST, quindi specifichi esplicitamente che si tratta di un POST che utilizza l'attributo [HttpPost]. Questo funziona, a patto che non è dichiarata all'interno di un'interfaccia ...

public interface IFooBarController 
{ 
    [HttpPost] 
    void DoSomething(); 

    [HttpPost] 
    void Delete(int id); 
} 

public class FooBarController : IFooBarController 
{ 
    public void DoSomething() 
    { 
     // This API method can only be called using POST, 
     // as you would expect from the interface. 
    } 

    public void Delete(int id) 
    { 
     // This API method can only be called using DELETE, 
     // even though the interface specifies [HttpPost]. 
    } 
} 

Come posso ovviare a questo, senza dover specificare il HttpPostAttribute per ogni implementazione?

+0

Utilizzerai il routing di attributo con questo web API? – Nkosi

+1

Mi sembra che i verbi http siano dettagli di implementazione e non appartengano all'interfaccia. –

+0

@BigDaddy, direi che fanno parte della firma del metodo API. –

risposta

2

Come altri hanno già detto, gli attributi non vengono ereditati. DoSomething non viene chiamato utilizzando il POST a causa dell'attributo nell'interfaccia ma perché questo è l'impostazione predefinita. Passa a GET nella tua interfaccia e noterai ancora POST chiamandolo.

È possibile leggere ulteriori informazioni sulla modalità di selezione dell'azione here nella sezione "Selezione azione". (L'articolo 3 risponde alla domanda sul motivo per cui DoSomething viene chiamato utilizzando il POST)

1

Gli attributi non sono ereditati dalle interfacce implementate, è necessario dichiarare l'attributo sull'implementazione concreta (FooBarController). Ciò sostituisce l'associazione basata sulla convenzione.

+1

Se è vero, come mai un metodo di interfaccia '[HttpPost] DoSomething()' può essere chiamato solo usando POST, anche se l'implementazione di detta interfaccia non ripete HttpPostAttribute? –

-2

uso [ActionName] Attribué e il nome che si desidera

4

attributi sulle proprietà di interfaccia non ottiene ereditati alla classe, si possono rendere l'interfaccia di una classe astratta.

trovato una risposta da Microsoft:

Il team del prodotto non vuole implementare questa funzione, per due principali motivi:

  • Coerenza con DataAnnotations.Validator
  • coerenza con la convalida comportamento in ASP.Net MVC
  • scenario difficile: una classe implementa due interfacce che hanno la stessa proprietà, ma con gli attributi in conflitto su di essi. Quale attributo avrà la precedenza?

FONTI: Attribute on Interface members does not work

+0

Ho chiesto questo a un'altra domanda, ma la ripeterò qui.Se gli attributi non sono ereditati, come mai un metodo di interfaccia '[HttpPost] DoSomething()' può essere chiamato solo usando POST, anche se l'implementazione di detta interfaccia non ripete HttpPostAttribute? –

+0

devi bypassare una classe astratta. – raoon

+0

wait non posso verificare ora;) lo farò quando torno a casa: p – raoon

Problemi correlati