Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calling an ASP.NET 4.0 WCF service from jQuery yields 400 Bad Request

I know it seems this question has been posted many times, but I've read nearly all of them (an most of the tutorials on the internet), and I still can't grasp what I'm doing wrong.

I tried to implement in a web site we're developing a WCF web service to be consumed by a jQuery script, but I keep getting 400 Bad Request when doing the AJAX request, and I'm starting to loose hope.

Please note that I'm new to WCF, and I've formed myself only through online tutorials, so it's entirely possible I overlook or majorly screwed up something.

Questions I tried but didn't help:

  • WCF Service returns 400 Bad Request
  • uploading large xml to WCF REST service -> 400 Bad request
  • 400 Bad Request HTTP Response using a WCF POST via JQuery
  • Error 400 (Bad Request) with WCF Tutorial?
  • Why does my C# client, POSTing to my WCF REST service, return (400) Bad Request?

External resources I read to no avail:

  • http://www.west-wind.com/weblog/posts/324917.aspx
  • http://www.c-sharpcorner.com/UploadFile/sridhar_subra/116/
  • http://learningbyfailing.com/2008/05/calling-wcf-from-jquery-using-parameters/
  • http://iainjmitchell.com/blog/?p=97
  • Many other...

I also tried creating a new solution, with only a page and the service, to rule out interferences, but I still have the same problem. Here you can find the code:

IService.cs

namespace WebService
{
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Web;

    [ServiceContract(Name = "Service", Namespace = "WebService")]
    public interface IService
    {
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped, Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        String Test();
    }
}

Service.svc.cs

namespace WebService
{
    using System;

    public class Service : IService
    {
        public String Test()
        {
            return "Hello, world.";
        }
    }
}

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebService.Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js" type="text/javascript"></script>
        <script type="text/javascript">
            $(document).ready(function () {
                $("#doAjax").click(function (event) {
                    event.preventDefault();
                    jQuery.ajax({
                        contentType: "application/json"
                        , dataType: "text"
                        , error: function (jqXHR, textStatus, errorThrown) {
                            console.group("AJAX error:");
                            console.debug(jqXHR);
                            console.debug(textStatus);
                            console.groupEnd();
                        }
                        , processData: false
                        , success: function (data, textStatus, jqXHR) {
                            console.group("AJAX success:");
                            console.debug(data);
                            console.debug(textStatus);
                            console.debug(jqXHR);
                            console.groupEnd();
                        }
                        , type: "post"
                        , url: "/Service.svc/Test"
                    });
                });
            });
        </script>
        <title>WebService</title>
    </head>
    <body>
        <form runat="server">
            <h1><%= this.Page.Title %></h1>
            <p><input id="doAjax" type="button" value="Run" /></p>
        </form>
    </body>
</html>

Web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>
    <system.serviceModel>
        <bindings />
        <client />
        <behaviors>
            <endpointBehaviors>
                <behavior name="Behavior">
                    <webHttp />
                </behavior>
            </endpointBehaviors>
            <serviceBehaviors>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
        <services>
            <service name="Service">
                <endpoint behaviorConfiguration="Behavior" binding="webHttpBinding" contract="WebService.IService" />
            </service>
        </services>
    </system.serviceModel>
</configuration>
like image 880
Albireo Avatar asked Oct 24 '22 15:10

Albireo


2 Answers

The service name must be fully qualified. Try: <service name="WebService.Service">

like image 60
mightymada Avatar answered Oct 27 '22 11:10

mightymada


Hey! I was having this same problem (.....again) but finally figured it out and got it working properly.

Now this is my own example, but because it worked for me, hopefully it will work for you too... The key line that I was forgetting was in my $ajax command:

contentType: "application/json; charset=utf-8"

Good luck :) I spent half a day on this issue.

interface:

[OperationContract]
[WebInvoke(ResponseFormat = WebMessageFormat.Json)]
int CreateMilestone(Milestone Input);

Class:

[DataContract]
public class Milestone
{
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string Date { get; set; }
    [DataMember]
    public int Risk { get; set; }
    [DataMember]
    public int Complexity { get; set; }
}

the method:

   public int CreateMilestone(Milestone Input)
    {
        return 0;
    }

the jquery:

$("#btnSubmit").click(function () {

    if ($.trim($("#txtName").val()) == "") {
        $("#dName").effect("highlight", 500);
    }
    else {

        var date = $("#txtDate").datepicker("getDate");
        var data = {
            Name: $("#txtName").val(),
            Date: (date.getMonth() + 1) + "-" + date.getDate() + "-" + date.getFullYear(),
            Risk: parseInt($("#sRisk").text()),
                Complexity: parseInt($("#sComplexity").text())
            };
            var jsondata = JSON.stringify(data);
            $.ajax({
                type: "POST",
                async: false,
                url: 'Services/ProjectService.svc/CreateMilestone',
                contentType: "application/json; charset=utf-8",
                data: jsondata,
                dataType: "json",
                success: function (msg) {
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    //                        alert(XMLHttpRequest.status);
                    //                        alert(XMLHttpRequest.responseText);
                }
            });
        }
    });
like image 33
RoboKozo Avatar answered Oct 27 '22 09:10

RoboKozo