Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Consume form data by wcf service sending by post

I read some articles about this and I find that to achive that wcf get data from post request we add

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

and in implementation

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();
}

My question is what should I do that in submit action in form request will send to my service and consume?

In Stream parameter will I have post information from form to which I could get by Request["FirstName"]?

like image 873
netmajor Avatar asked Aug 29 '11 09:08

netmajor


1 Answers

Your code isn't decoding the request body correctly - you're creating an array of string values, each one with one character. After getting the request body, you need to parse the query string (using HttpUtility is an easy way to do so). The code below shows how to get the body and one of the fields correctly.

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();
    }
}
like image 66
carlosfigueira Avatar answered Nov 03 '22 17:11

carlosfigueira