2008-09-03 28 views
39

En el proceso de desarrollo de mi primer servicio WCF y cuando trato de usarlo obtengo "Método no permitido" sin otra explicación.Servicio WCF que devuelve "Método no permitido"

Tengo mi interfaz configurada con la ServiceContract y OperationContract:

[OperationContract] 
    void FileUpload(UploadedFile file); 

Junto con el método real:

public void FileUpload(UploadedFile file) {}; 

para acceder al servicio entro http://localhost/project/myService.svc/FileUpload pero me da la Error "Método no permitido"

¿Me está faltando algo?

Respuesta

58

Su navegador envía una solicitud HTTP GET: Asegúrese de que tiene el atributo WebGet en la operatio n en el contrato:

[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. 
} 
+3

Esto no funcionó para mí (asp.net en framework 4.0) pero la respuesta de darthjit a continuación fue – Quango

+5

entonces ¿por qué se verifica esta en lugar de darjhit? –

+0

@LeiLeyba Porque el autor marca la respuesta, no la comunidad –

4

Los tipos intrínsecos básicos (por ejemplo, byte, int, string y matrices) serán serializados automáticamente por WCF. Las clases personalizadas, como su UploadedFile, no lo serán.

Entonces, una pregunta tonta (pero tengo que preguntarlo ...): ¿está UploadedFile marcado como [DataContract]? De lo contrario, deberá asegurarse de que así sea y de que cada uno de los miembros de la clase que desee enviar esté marcado con [DataMember].

A diferencia de la comunicación remota, donde marcar una clase con [XmlSerializable] le permitió serializar toda la clase sin molestarse en marcar los miembros que desea serializar, WCF necesita que marque cada miembro. (Creo que esto está cambiando en .NET 3.5 SP1 ...)

Un tremendo recurso para el desarrollo WCF es lo que conocemos en nuestra tienda como "el libro del pescado": Programming WCF Services por Juval Lowy. A diferencia de algunos de los otros libros de WCF, que son un tanto áridos y académicos, este tiene un enfoque práctico para la construcción de servicios WCF y es realmente útil. Completamente recomendado.

1

Parece que usted está utilizando una dirección incorrecta:

para acceder al servicio entro http://localhost/project/myService.svc/FileUpload

Suponiendo que quiere decir que es la dirección de dar su código de cliente entonces sospecho que en realidad debería ser:

http://localhost/project/myService.svc 
70

Si está utilizando el atributo [WebInvoke(Method="GET")] en el método de servicio, asegúrese de que se escribe el nombre del método como "GET" y no "Get" o "tener", ya que es sensible a mayúsculas ! Tuve el mismo error y me llevó una hora descubrirlo.

+0

Ja, este era mi problema. Gracias. – canon

+0

¡Esta solución también me ayudó a resolver el error 405! ¡Gracias! – YoYoMyo

+0

Spot on! (Por supuesto, utilicé "Obtener" en lugar de "OBTENER") :) –

-1

Solo se puede acceder a los métodos con WebGet desde el navegador IE; se puede acceder a otros verbos HTTP con solo teclear la dirección

Usted puede tratar kit reparador de inicio del servicio de codeples o utilizar Fiddler para probar sus otros verbos HTTP

+0

Creo que realmente intenta decir esto: puede probar los mensajes GET en un navegador, pero otros verbos deben probarse en Fiddler. Estoy de acuerdo. – flobadob

0

es necesario agregar en 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> 
1

He tenido este mismo problema durante más de un día, finalmente lo descubrí. Gracias a @Sameh por la pista.

Su servicio probablemente esté funcionando bien. Probar los mensajes POST utilizando la barra de direcciones de un navegador no funcionará. Necesita usar Fiddler para probar un mensaje POST.

instrucciones Fiddler ... http://www.ehow.com/how_8788176_do-post-using-fiddler.html

+0

Además, acaba de encontrar el complemento RESTClient para Firefox/Chrome/others. Es mucho más fácil de usar que Fiddler, podría ser una mejor opción para empezar. – flobadob

+0

No * necesita * usar Fiddler. Puedes hacer esto sin instalar nada; simplemente guarde el siguiente código HTML en un archivo (después de haber editado la URL) y ábralo en un navegador:

0

Mi caso: la configuración del servicio en el nuevo servidor. ASP.NET 4.0 no se instaló/registró correctamente; la extensión svc no fue reconocida.

Cuestiones relacionadas