I created a WCF web service in ASP.NET 4.5 in VS2012 that returns a JSON response. The service works fine with the built in webservice client and I got the endpoints set up correctly in the Web.config file.
On the client side, I have a simple test script in Jquery, however, after running the script, I get a HTTP/1.1 400 Bad Request.
The web service requires no input at all - so data: is set to an empty string.
Here is what I get when calling the service (using HTTP Live Headers add-on in FireFox).
http://localhost:58234/CCSVC.svc/Get_BTCE_BTC_USD
OPTIONS /CCSVC.svc/Get_BTCE_BTC_USD HTTP/1.1
Host: localhost:58234
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Origin: http://localhost:59099
Access-Control-Request-Method: GET
Access-Control-Request-Headers: content-type
Connection: keep-alive
HTTP/1.1 400 Bad Request
Cache-Control: private
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RTpcc2l0ZXMyXENyeXB0b0NvaW5TZXJ2aWNlc1xDQ1NWQy5zdmNcR2V0X0JUQ0VfQlRDX1VTRA==?=
X-Powered-By: ASP.NET
Date: Mon, 23 Dec 2013 16:08:27 GMT
Content-Length: 0
And the script:
$(document).ready(function () {
$('#btnRefresh').click(function () {
$.ajax({
type: 'GET',
url: 'http://localhost:58234/CCSVC.svc/Get_BTCE_BTC_USD',
data: '',
contentType: 'application/json',
dataType: 'json',
processData: true,
crossDomain: true,
success: function (msg) {
ServiceSucceeded(msg);
},
error: function (msg) {
ServiceFailed(msg);
}
});
function ServiceSucceeded(result) {
alert("success");
};
function ServiceFailed(result) {
alert("fail");
};
});
});
naturally, it fails. I've tried several different combinations with no luck and POST, as well as GET. crossDomain true/false, processData true/false, etc. nothing seems to work.
Here's the CONTRACT for the webservice:
<OperationContract()>
<WebInvoke(BodyStyle:=WebMessageBodyStyle.Bare, RequestFormat:=WebMessageFormat.Json, ResponseFormat:=WebMessageFormat.Json)>
Function Get_BTCE_BTC_USD() As TradeData
This appears to be a problem with the request, but the error does not indicated what that might be.
Here is the inside of the web.config in the WCF service:
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="CryptoCoinServices.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" strict="false" explicit="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5"/>
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the values below to false before deployment -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
<behavior name="metadataBehavior">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="metadataBehavior" name="CryptoCoinServices.Service1">
<!-- leave address empty for localhost -->
<endpoint
address=""
binding="basicHttpBinding"
contract="CryptoCoinServices.IService1"
/>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
To browse web app root directory during debugging, set the value below to true.
Set to false before deployment to avoid disclosing web app folder information.
-->
<directoryBrowse enabled="true"/>
</system.webServer>
Here are recommended changes in the jQuery script (still doesn't work, but the {} for the data is mandatory, apparently):
$.ajax({
type: 'POST',
url: 'http://localhost:58234/CCSVC.svc/Get_BTCE_BTC_USD',
data: '{}',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
processData: true,
crossDomain: true,
success: function (msg) {
ServiceSucceeded(msg);
},
error: function (msg) {
ServiceFailed(msg);
}
});
New Error after change to webHttpBinding:
http://localhost:58234/CCSVC.svc/Get_BTCE_BTC_USD
OPTIONS /CCSVC.svc/Get_BTCE_BTC_USD HTTP/1.1
Host: localhost:58234
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Origin: http://localhost:59099
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Length: 513
Content-Type: application/xml; charset=utf-8
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RTpcc2l0ZXMyXENyeXB0b0NvaW5TZXJ2aWNlc1xDQ1NWQy5zdmNcR2V0X0JUQ0VfQlRDX1VTRA==?=
X-Powered-By: ASP.NET
Date: Mon, 23 Dec 2013 17:02:44 GMT
webHttpBinding
) – marc_sbasicHttpBinding
, a SOAP-based binding - which works great, just not in conjunction with jQuery. You'll need to look into thewebHttpBinding
and how to leverage that in your service, so that your jQuery client can call your service method – marc_s