how to call wcf restful service from fiddler by JSON request?

后端 未结 2 1308

I am new in wcf restful service. I couldn’t find the problem which was, why my wcf restful service give ‘bad request’. I use .NET 4.0.

My service is:

相关标签:
2条回答
  • 2021-02-09 07:01

    The way you'll find out the issue with your code is to enable tracing on the server, and it will have an exception explaining the problem. I wrote a simple test with your code, and it had a similar error (400), and the traces had the following error:

    The data contract type 'WcfForums.StackOverflow_7058942+Number' cannot be
    deserialized because the required data members '<Number1>k__BackingField,
    <Number2>k__BackingField' were not found.
    

    Data types marked with [Serializable] serialize all the fields in the object, not properties. By commenting out that attribute, the code actually works out fine (the type then falls into the "POCO" (Plain Old Clr Object) rule, which serializes all public fields and properties.

    public class StackOverflow_7058942
    {
        //[Serializable]
        public class Number
        {
            public int Number1 { get; set; }
            public int Number2 { get; set; }
        }
        [ServiceContract]
        public class Service
        {
            [OperationContract(Name = "Add")]
            [WebInvoke(UriTemplate = "test/", Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
            public int Add(Number n1)
            {
                int res = Convert.ToInt32(n1.Number1) + Convert.ToInt32(n1.Number2);
                return res;
            }
        }
        public static void Test()
        {
            string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
            ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
            host.AddServiceEndpoint(typeof(Service), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());
            host.Open();
            Console.WriteLine("Host opened");
    
            WebClient c = new WebClient();
            c.Headers[HttpRequestHeader.ContentType] = "application/json; charset=utf-8";
            c.Encoding = Encoding.UTF8;
            Console.WriteLine(c.UploadString(baseAddress + "/test/", "{\"Number1\":\"7\",\"Number2\":\"7\"}"));
    
            Console.Write("Press ENTER to close the host");
            Console.ReadLine();
            host.Close();
        }
    }
    
    0 讨论(0)
  • 2021-02-09 07:15

    One thing you are doing wrong is the format of the request object. Chang it to:

    { n1: { "Number1":"7","Number2":"7"} }
    

    The parameter names are the root property names of the json object passed to a wcf json endpoint.

    I have a sample wcf service on git. Amongst other things, it has a json endpoint and in the Default.asmx I use jquery to make a call to it. I would suggest you construct a similar webpage (host it on the same website as the WCF service) that calls your json service via jquery and test the service with that while fiddler is running to get a sample request. This will be easier and less error prone than constructing the request yourself since jquery will take care of lots of details in the header.

    The sample jquery ajax code for calling my echo service that you can adapt for your service is as follows:

        $("#btnEchoString").click(function () {
            var request = $("#request");
            var response = $("#response");
            $.ajax({
                url: 'EchoService.svc/JSON/Echo',
                type: "POST",
                contentType: "application/json; charset=utf-8",
                data: JSON.stringify({ request: request.val() }),
                dataType: "json",
                success: function (data) {
                    response.val(data.d);
                },
                error: function (request, status, error) {
                    //TODO: do something here
                }
            });
        });
    
    0 讨论(0)
提交回复
热议问题