2011-08-29 9 views
5

He leído algunos artículos sobre esto y me parece que a achive que WCF obtener datos de petición de post añadimosConsumir datos del formulario a través del servicio WCF enviar por correo

[ServiceContract] 
public interface IService1 { 
    [OperationContract] 
    [WebInvoke(
     Method = "POST", 
     BodyStyle = WebMessageBodyStyle.Bare, 
     UriTemplate = "/GetData")] 
    void GetData(Stream data); 
} 

y en aplicación

public string GetData(Stream input) 
{ 
    long incomingLength = WebOperationContext.Current.IncomingRequest.ContentLength; 
    string[] result = new string[incomingLength]; 
    int cnter = 0; 
    int arrayVal = -1; 
    do 
    { 
     if (arrayVal != -1) result[cnter++] = Convert.ToChar(arrayVal).ToString(); 
     arrayVal = input.ReadByte(); 
    } while (arrayVal != -1); 

    return incomingLength.ToString(); 
} 

Mi pregunta es, ¿qué debo hacer para enviar una solicitud en forma de solicitud a mi servicio y consumir?

En el parámetro Stream tengo información posterior de la forma a la que podía llegar a funcionar Solicitud [ "Nombre"]?

Respuesta

10

El código no está decodificando el cuerpo de solicitud correctamente - que está creando una serie de string valores, cada uno con un carácter. Después de conseguir el cuerpo de la petición, es necesario analizar la cadena de consulta (utilizando HttpUtility es una manera fácil de hacerlo). El siguiente código muestra cómo obtener el cuerpo y uno de los campos correctamente.

public class StackOverflow_7228102 
{ 
    [ServiceContract] 
    public interface ITest 
    { 
     [OperationContract] 
     [WebInvoke(
      Method = "POST", 
      BodyStyle = WebMessageBodyStyle.Bare, 
      UriTemplate = "/GetData")] 
     string GetData(Stream data); 
    } 
    public class Service : ITest 
    { 
     public string GetData(Stream input) 
     { 
      string body = new StreamReader(input).ReadToEnd(); 
      NameValueCollection nvc = HttpUtility.ParseQueryString(body); 
      return nvc["FirstName"]; 
     } 
    } 
    public static void Test() 
    { 
     string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
     WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress)); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     WebClient c = new WebClient(); 
     c.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; 
     Console.WriteLine(c.UploadString(baseAddress + "/GetData", "FirstName=John&LastName=Doe&Age=33")); 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
} 
+0

Es una gran solución Tnx;) Pero en el método de prueba, invoca el servicio y lo envía después de la solicitud. Es posible (y es una forma inteligente de hacerlo) invocar el método del servicio después de enviarlo en forma como

? Si lo hago así, ¿funcionará? :) – netmajor

+0

Sí, debería funcionar (los métodos de prueba simula lo enviaría un formulario de envío HTML). El hecho es que cuando realiza un envío de formulario de forma predeterminada, debe crear una página HTML para enviarla de regreso (en lugar de una cadena simple), de lo contrario, el navegador solo le mostrará la secuencia de regreso. Otra opción es utilizar alguna llamada ajax en el formulario enviado, luego puede obtener el resultado como XML (o JSON) y actualizar la página en línea. – carlosfigueira

Cuestiones relacionadas