Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WCF WebInvoke Method POST

I have a wcf service, and I want to test posting data to it. But the parameter of my function never gets any values.

[OperationContract]
[WebInvoke(UriTemplate = "TestPost", Method = "POST", 
        ResponseFormat = WebMessageFormat.Json,
        RequestFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.WrappedRequest)]
int Test(string value);

public int Test(string value)  //Value stays null
{
    return 0;
}

The JSON request I send, build using Fiddler2

http://localhost:49633/Service1.svc/TestPost

User-Agent: Fiddler
Host: localhost:49633
Content-Length: 42
Content-type: application/json

{"value":{"name":"value","name1":"value"}}

I want the parameter to contain a JSON string, so basically I am creating a JSON request that contains a JSON object, because I want to deserialize the JSON object later on into one of my custom objects. Any ideas why the value parameter stays null?

Thanks

like image 861
Armand Avatar asked Jun 19 '26 01:06

Armand


1 Answers

I am using the below method to post the json string to the service defined above and it works for me:

My service:

[WebInvoke(UriTemplate = "TestPost", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
        public int Test(string value)
        {
            Console.Write(value);
            return 1;
        }

My Client:

private string UseHttpWebApproach(string serviceUrl, string resourceUrl, string method, string requestBody)
        {
            string responseMessage = null;                
            var request = WebRequest.Create(string.Concat(serviceUrl, resourceUrl)) as HttpWebRequest;
            if (request != null)
            {                    
                request.ContentType = "application/json";
                request.Method = method;
            }

            //var objContent = HttpContentExtensions.CreateDataContract(requestBody);
            if(method == "POST" && requestBody != null)
            {                   
                byte[] requestBodyBytes = ToByteArrayUsingJsonContractSer(requestBody);                
                request.ContentLength = requestBodyBytes.Length;
                using (Stream postStream = request.GetRequestStream())
                    postStream.Write(requestBodyBytes, 0, requestBodyBytes.Length);

            }

            if (request != null)
            {
                var response = request.GetResponse() as HttpWebResponse;
                if(response.StatusCode == HttpStatusCode.OK)
                {
                    Stream responseStream = response.GetResponseStream();
                    if (responseStream != null)
                    {
                        var reader = new StreamReader(responseStream);

                        responseMessage = reader.ReadToEnd();
                    }
                }
                else
                {
                    responseMessage = response.StatusDescription;
                }
            }
            return responseMessage;
        }

private static byte[] ToByteArrayUsingJsonContractSer(string requestBody)
        {
            byte[] bytes = null;
            var serializer1 = new DataContractJsonSerializer(typeof(string));
            var ms1 = new MemoryStream();
            serializer1.WriteObject(ms1, requestBody);
            ms1.Position = 0;
            var reader = new StreamReader(ms1);
            bytes = ms1.ToArray();
            return bytes;
        }

My call on the client to the UseHttpWebApproach is as below:

string serviceBaseUrl = <<your service base url>>;
string resourceUrl = "/TestPost";
string method = "POST";
string jsonText = "{\"value\":{\"name\":\"value\",\"name1\":\"value\"}}";
UseHttpWebApproach(serviceBaseUrl, resourceUrl, method, jsonText);

Below is my Fiddler Request:

POST http://localhost/VDName/AppName/TestPost HTTP/1.1
Content-Type: application/json
Content-Length: 54
Connection: Keep-Alive

"{\"value\":{\"name\":\"value\",\"name1\":\"value\"}}"
like image 159
Rajesh Avatar answered Jun 20 '26 15:06

Rajesh



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!