使用JQuery AJAX通过多个绑定调用WCF服务

时间:2013-08-21 14:11:01

标签: wcf jquery

我有一个WCF服务,其中三个端点具有不同的绑定(soap客户端的basicHttpBinding,jquery ajax客户端的webHttpBinding和mex)。

我可以通过SOAP访问服务(然后添加服务引用):

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

但是为什么我从Jquery Ajax调用我得到404错误。

如果我将服务复制到测试项目中并且只定义一个webHttpBinding,我可以通过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
        });
    }

在我的端点配置中,我已将webHttp端点的地址设置为“”,因为我不知道如何在从jquery调用时选择特定端点。

任何人都有任何想法我为什么会收到404错误?

1 个答案:

答案 0 :(得分:0)

1)确保您的Service.svc位于根目录中。

2)添加

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

到实例化TestMethod的地方。像这样:

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

这些都有帮助吗?