0
votes

I have a WCF service with three endpoints with different bindings (basicHttpBinding for soap clients, webHttpBinding for jquery ajax client, and mex).

I can access the service via SOAP (by adding a Service Reference then):

        ServiceRef.IService service = new ServiceClient("BasicHttpBinding_IService");
        Response.Write(service.TestMethod("hi"));

But why I call from Jquery Ajax I get a 404 error.

If I copy the service into a test project and define only one webHttpBinding, I can call the service via jquery.

IService.cs

   [ServiceContract]
    public interface IService
    {
        [OperationContract]
        [WebInvoke(Method = "POST",
         ResponseFormat = WebMessageFormat.Json)]
         Response TestMethod(string Id);
....

Service.cs

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior]
public class Service : IService
{
    [OperationBehavior]
    public Response TestMethod(string Id)
    {
        Response resp = new Response();
        resp.Message = "hello";
        return resp;
    }
....

Web.Config

  <system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="false" aspNetCompatibilityEnabled="true" />
<services>
  <service
   name="eBooks.Presentation.Wcf.Service"
   behaviorConfiguration="eBooks.Presentation.Wcf.ServiceBehavior">
    <!-- use base address provided by host -->
    <!-- specify BasicHttp binding and a binding configuration to use -->
    <endpoint address="soap"
              binding="basicHttpBinding"
              bindingConfiguration="Binding1"
              contract="eBooks.Presentation.Wcf.IService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      <endpoint address="" binding="webHttpBinding"
          contract="eBooks.Presentation.Wcf.IService" behaviorConfiguration="EndpBehavior"/>
  </service>
</services>
<bindings>
  <!-- 
      Following is the expanded configuration section for a BasicHttpBinding.
      Each property is configured with the default value.
      See the TransportSecurity, and MessageSecurity samples in the
      Basic directory to learn how to configure these features.
      -->
  <basicHttpBinding>
    <binding name="Binding1"
             hostNameComparisonMode="StrongWildcard"
             receiveTimeout="00:10:00"
             sendTimeout="00:10:00"
             openTimeout="00:10:00"
             closeTimeout="00:10:00"
             maxReceivedMessageSize="65536"
             maxBufferSize="65536"
             maxBufferPoolSize="524288"
             transferMode="Buffered"
             messageEncoding="Text"
             textEncoding="utf-8"
             bypassProxyOnLocal="false"
             useDefaultWebProxy="true" >
      <security mode="None" />
    </binding>
  </basicHttpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="eBooks.Presentation.Wcf.ServiceBehavior">
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpGetEnabled="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="true"/>
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="EndpBehavior">
      <webHttp/>
    </behavior>
  </endpointBehaviors>
</behaviors>

Jquery

    function CallService() {
        $.ajax({
            type: "POST", //GET or POST or PUT or DELETE verb
            url: "http://localhost:888/Service.svc/TestMethod", // Location of the service
            data: '{"Id": "1"}', //Data sent to server
            contentType: "application/json; charset=utf-8", // content type sent to server
            dataType: "json", //Expected data format from server
            processdata: ProcessData, //True or False
            success: function (msg) {//On Successfull service call
                ServiceSucceeded(msg);
            },
            error: ServiceFailed// When Service call fails
        });
    }

In my endpoint configuration I have set the address for the webHttp endpoint to be "" as I dont know how to select a specific endpoint when calling from jquery.

Anyone have any ideas why I am getting this 404 error?

1

1 Answers

0
votes

1) Make sure your Service.svc is in the root directory.

2) Add the

[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json)]

To the place where you instantiate your TestMethod. like this:

[OperationBehavior]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json)]
public Response TestMethod(string Id)
{
    Response resp = new Response();
    resp.Message = "hello";
    return resp;
}

Either of those help?