2011-07-09 160 views
4

任何人都知道這有什麼問題嗎?我無法得到我的wcf休息服務的JSON響應。wcf REST服務和JQuery Ajax Post:不允許使用方法

jQuery的

 


$.ajax({ 
    type: 'POST', 
    url: "http://localhost:8090/UserService/ValidateUser", 
    data: {username: 'newuser', password: 'pwd'}, 
    contentType: "application/json; charset=utf-8", 
    success: function(msg) { 
    alert(msg); 
    }, 

    error: function(xhr, ajaxOptions, thrownError) { 
    alert('error'); 
    } 

}); 

 

服務

 


    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
    public class UserService: IUserService 
    { 
     private readonly IUserRepository _repository; 

     public UserService() 
     { 
      _repository = new UserRepository(); 
     } 

     public ServiceObject ValidateUser(string username, string password) 
     { 
      //implementation 
     } 
    } 

    [ServiceContract] 
    public interface IUserService 
    { 
     [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] 
     [OperationContract] 
     ServiceObject ValidateUser(string username, string password); 
    } 

 

web配置

 


<system.serviceModel> 

    <!--Behaviors here.--> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="defaultEndpointBehavior"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 

     <serviceBehaviors> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <!--End of Behaviors--> 

    <!--Services here--> 
    <services> 
     <service name="MyWcf.Services.UserService"> 
     <endpoint address="UserService" behaviorConfiguration="defaultEndpointBehavior" 
      binding="webHttpBinding" contract="MyWcf.Services.IUserService" /> 
     </service> 
    </services> 

    <!--End of Services--> 

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    <standardEndpoints> 
     <webHttpEndpoint> 
     <standardEndpoint name="" 
          helpEnabled="true" 
          automaticFormatSelectionEnabled="true" 
          defaultOutgoingResponseFormat ="Json" 
          crossDomainScriptAccessEnabled="true"/> 
     </webHttpEndpoint> 
    </standardEndpoints> 
    </system.serviceModel> 

 

回答

9

我看到你的代碼中的多個問題:

405意味着不允許的方法 - 這可能意味着你是發佈數據到錯誤的資源。你確定你的地址是正確的嗎?你如何公開這項服務?是.svc文件還是ServiceRoute?如果是.svc文件中的地址將是UserService.svc/UserService/ValidateUser

  • UserService.svc因爲這是入口點爲您服務(如果您正在使用ServiceRoute你可以因爲你是決定性的端點,這個相對地址重新定義這個
  • UserService配置
  • 的ValidateUser,因爲這是默認的入口點操作

現在你的JSON請求完全是壞的,你的方法的簽名也是如此。喲方法簽名烏爾服務合同必須指望單個JSON對象=它必須是單一的數據合同,如:

[DataContract] 
public class UserData 
{ 
    [DataMember] 
    public string UserName { get; set; } 

    [DataMember] 
    public string Password { get; set; } 
} 

和操作簽名會:

[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)] 
[OperationContract] 
ServiceObject ValidateUser(UserData userData); 

有一個在JSON請求沒有包裝元素,也因爲你必須使用Bare。也不需要設置響應格式,因爲您將它設置在端點級別(順便說一句,如果不這樣做,您還必須設置請求格式)。

一旦你定義的數據合同,你的要求,你必須正確地定義AJAX請求本身:

$.ajax({ 
    type: 'POST', 
    url: "UserService.svc/UserService/ValidateUser", 
    data: '{"UserName":"newuser","Password":"pwd"}', 
    contentType: "application/json; charset=utf-8", 
    success: function (msg) { 
    alert(msg); 
    }, 

    error: function (xhr, ajaxOptions, thrownError) { 
    alert('error'); 
    } 

}); 

JSON對象是字符串!和所有的成員!

對於最後修改你的配置:

<system.serviceModel> 
    <services> 
    <service name="UserService.UserService"> 
     <endpoint address="UserService" kind="webHttpEndpoint" contract="UserService.IUserService" /> 
    </service> 
    </services> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    <standardEndpoints> 
    <webHttpEndpoint> 
     <standardEndpoint helpEnabled="true" automaticFormatSelectionEnabled="true" /> 
    </webHttpEndpoint> 
    </standardEndpoints> 
</system.serviceModel> 

如果你想使用standardEndpoint必須在端點定義使用kind,你並不需要指定的行爲(這是標準的端點的一部分)。此外,您並未使用跨域調用,因此您無需啓用它們,而且您也不需要默認格式,因爲它會自動解析。

+0

我正在使用WCF沒有.svc文件。 – h3n

+0

我跟着你的修改,當我嘗試它時,它說:合同'IUserService'的'ValidateUser'操作指定了多個請求主體參數,在沒有任何包裝器元素的情況下被序列化。至多有一個身體參數可以在沒有包裝元素的情況下被序列化。刪除額外的主體參數或將WebGetAttribute/WebInvokeAttribute上的BodyStyle屬性設置爲Wrapped。 – h3n

+0

所以你沒有按照我的修改,因爲我的'ValidateUser'沒有多個請求主體參數。 –

1

您在一個域上測試過,我想作者嘗試從不同的域進行調用。由於跨域呼叫,這可能是不可能的。

2

我相信伊萬在這裏是正確的軌道!

您正在瀏覽器中調用JavaScript的服務,對不對?

帶有該javascript的html頁面是否與wcf服務位於同一個域中?

如果他們不在同一個域中,那麼我會說,這是一個跨站點腳本問題。我相信GET允許跨站點,但POST不是。 http://en.wikipedia.org/wiki/JSONP將是一個解決方案,如果它支持服務器端(由WCF)

+0

您提到過POST不允許在跨域WCF REST JQuery Ajax Call中使用。你能給我來源嗎?因爲從您的帖子中,我只學習了POST不支持跨域。由於安全原因,我想使用POST,但它不起作用。 – Firnas

+0

在http://en.wikipedia.org/wiki/Same_origin_policy中有相當好的解釋,但如果您正在尋找答案,您可以在這裏找到一些建議,例如, http://stackoverflow.com/questions/298745/how-do-i-send-a-cross-domain-post-request-via-javascript – Joakim

相關問題