2013-08-21 45 views
0

我有一個WCF服務與三個端點具有不同的綁定(basicHttpBinding爲肥皂客戶端,webHttpBinding爲jQuery ajax客戶端和mex)。使用JQuery AJAX調用WCF服務與多個綁定

我可以(通過添加服務參考當時的)通過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錯誤?

回答

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; 
} 

其中之一幫助?

+0

是的,[WebInvoke]可能不需要。但值得一試。 – Richard