Servizio WCF che restituisce "metodo non consentito"
-
09-06-2019 - |
Domanda
Nel processo di sviluppo del mio primo servizio WCF e quando provo a utilizzarlo ricevo "Metodo non consentito" senza altra spiegazione.
Ho configurato la mia interfaccia con ServiceContract e OperationContract:
[OperationContract]
void FileUpload(UploadedFile file);
Insieme al metodo vero e proprio:
public void FileUpload(UploadedFile file) {};
Per accedere al Servizio entro http://localhost/project/myService.svc/FileUploadma ricevo l'errore "Metodo non consentito".
Mi sto perdendo qualcosa?
Soluzione
Il tuo browser sta inviando una richiesta HTTP GET:Assicurati di avere l'attributo WebGet sull'operazione nel contratto:
[ServiceContract]
public interface IUploadService
{
[WebGet()]
[OperationContract]
string TestGetMethod(); // This method takes no arguments, returns a string. Perfect for testing quickly with a browser.
[OperationContract]
void UploadFile(UploadedFile file); // This probably involves an HTTP POST request. Not so easy for a quick browser test.
}
Altri suggerimenti
Se stai utilizzando il [WebInvoke(Method="GET")]
attributo sul metodo del servizio, assicurati di scrivere il nome del metodo come "GET" e non "Get" o "get" poiché fa distinzione tra maiuscole e minuscole!Ho avuto lo stesso errore e mi ci è voluta un'ora per capirlo.
I tipi intrinseci di base (ad es. byte
, int
, string
, e matrici) verranno serializzati automaticamente da WCF.Le classi personalizzate, come il tuo UploadedFile, non lo saranno.
Quindi, una domanda stupida (ma devo farla...):è il file caricato contrassegnato come a [DataContract]
?In caso contrario, dovrai assicurarti che lo sia e che ciascuno dei membri della classe che desideri inviare sia contrassegnato con [DataMember].
A differenza dei servizi remoti, in cui contrassegnare una classe con [XmlSerializable] ti consentiva di serializzare l'intera classe senza preoccuparti di contrassegnare i membri che volevi serializzare, WCF richiede che tu contrassegni ciascun membro.(Credo che questo stia cambiando in .NET 3.5 SP1...)
Una straordinaria risorsa per lo sviluppo della WCF è ciò che nel nostro negozio chiamiamo "il libro del pesce": Programmazione dei servizi WCF di Juval Lowy.A differenza di altri libri WCF in circolazione, che sono un po' aridi e accademici, questo adotta un approccio pratico alla creazione dei servizi WCF ed è effettivamente utile.Altamente raccomandato.
Sembra che tu stia utilizzando un indirizzo errato:
Per accedere al Servizio entro http://localhost/project/myService.svc/FileUpload
Supponendo che tu intenda che questo è l'indirizzo che fornisci al tuo codice cliente, sospetto che in realtà dovrebbe essere:
http://localhost/project/myService.svc
E' più di un giorno che ho lo stesso problema, finalmente ho risolto.Grazie a @Sameh per il suggerimento.
Probabilmente il tuo servizio funziona bene.Testare i messaggi POST utilizzando la barra degli indirizzi di un browser non funzionerà.È necessario utilizzare Fiddler per testare un messaggio POST.
Istruzioni per il violinista...http://www.ehow.com/how_8788176_do-post-using-fiddler.html
Dal browser IE è possibile accedere solo ai metodi con WebGet;puoi accedere ad altri verbi http semplicemente digitando l'indirizzo
Puoi provare il kit di avvio del servizio Restful di codeples o utilizzare Fiddler per testare gli altri verbi http
è necessario aggiungere web.config
<endpoint address="customBinding" binding="customBinding" bindingConfiguration="basicConfig" contract="WcfRest.IService1"/>
<bindings>
<customBinding>
<binding name="basicConfig">
<binaryMessageEncoding/>
<httpTransport transferMode="Streamed" maxReceivedMessageSize="67108864"/>
</binding>
</customBinding>
Il mio caso:configurazione del servizio su nuovo server.ASP.NET 4.0 non è stato installato/registrato correttamente;L'estensione svc non è stata riconosciuta.