Solución:
Si está utilizando el [WebInvoke(Method="GET")]
atributo en el método de servicio, asegúrese de escribir el nombre del método como “GET” y no “Get” o “get”, ya que distingue entre mayúsculas y minúsculas. Tuve el mismo error y me tomó una hora resolverlo.
Su navegador está enviando una solicitud HTTP GET: asegúrese de tener el atributo WebGet en la operació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.
}
Los tipos intrínsecos básicos (p. Ej. 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 hacerla …): ¿UploadedFile está marcado como un [DataContract]
? De lo contrario, deberá asegurarse de que lo sea y de que cada uno de los miembros de la clase que desea 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 deseaba serializar, WCF necesita que marque cada miembro. (Creo que esto está cambiando en .NET 3.5 SP1 …)
Un recurso tremendo para el desarrollo de WCF es lo que conocemos en nuestra tienda como “el libro de peces”: Programación de servicios WCF por Juval Lowy. A diferencia de algunos de los otros libros de WCF, que son un poco secos y académicos, este tiene un enfoque práctico para crear servicios WCF y es realmente útil. Totalmente recomendado.