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>