ShrnPrmshr
ShrnPrmshr

Reputation: 363

WCF REST can not parse Request Body

I have a struggling time with WCF REST to parse request body. My problem:

My code:

[ServiceContract]
public interface IService
{
    [OperationContract]
    [WebInvoke(Method = "POST",
                BodyStyle = WebMessageBodyStyle.Bare,
                RequestFormat = WebMessageFormat.Json,
                ResponseFormat = WebMessageFormat.Json,
                UriTemplate = "/X/{y}?Z={z}")
                ]
    string GetRequest(string y, string z, Request request);
}
public class Service : IService
{
    public string GetRequest(string y, string z, Request request)
    {
        //Do sth
    }


[DataContract]
public class Request
{
    [DataMember]
    [JsonProperty("id")]
    public String  Id { get; set; }
}

The problem that I have is that y and z has data and they are correct BUT id in request is null. I expected to be "id".

I searched a lot in the internet and I found Stream solution which is not easily to follow in this case. I am wondering if anyone has a clever idea to do this.

Upvotes: 2

Views: 1058

Answers (1)

GSerjo
GSerjo

Reputation: 4778

Take a look on this version

The Service

namespace ServiceTest
{
    internal class Program
    {
        private static WebServiceHost _service;

        private static void Main()
        {
            _service = new WebServiceHost(typeof (Service));
            Console.WriteLine("The service has started");
            _service.Open();
            Console.ReadKey();
        }
    }

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public sealed class Service : IService
    {
        public string GetRequest(string y, string z, Request request)
        {
            Console.WriteLine("Y: {0}, Z: {1}, request: {2}", y, z, request);
            return "Ok";
        }
    }

    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json, UriTemplate = "/X/{y}?Z={z}")]
        string GetRequest(string y, string z, Request request);
    }

    [DataContract]
    public sealed class Request
    {
        [DataMember]
        public string Id { get; set; }

        public override string ToString()
        {
            return string.Format("Id: {0}", Id);
        }
    }
}

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

    <system.serviceModel>
        <services>
            <service name="ServiceTest.Service">
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:9090/webhost" />
                    </baseAddresses>
                </host>
                <endpoint binding="webHttpBinding" contract="ServiceTest.IService" />
            </service>
        </services>
    </system.serviceModel>

    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

The Client

internal class Program
{
    private static void Main(string[] args)
    {
        var client = new HttpClient();
        var request = new Request {Id = "Nelibur"};
        var result = client.PostAsync("http://localhost:9090/webhost/X/Y?Z=2000", CreateContent(request)).Result;
        Console.WriteLine(result.Content.ReadAsStringAsync().Result);
        Console.ReadKey();
    }

    private static StringContent CreateContent<T>(T value)
    {
        using (var stream = new MemoryStream())
        {
            var serializer = new DataContractJsonSerializer(typeof (T));
            serializer.WriteObject(stream, value);
            string content = Encoding.UTF8.GetString(stream.ToArray());
            return new StringContent(content, Encoding.UTF8, "application/json");
        }
    }
}

Raw request:

POST http://localhost:9090/webhost/X/Y?Z=2000 HTTP/1.1
Content-Type: application/json; charset=utf-8
Host: localhost:9090
Content-Length: 16
Expect: 100-continue
Connection: Keep-Alive

{"Id":"Nelibur"}

You can try to use the request in for example Fiddler

Upvotes: 2

Related Questions