2011-07-09 20 views
4

誰にでも何が間違っているのか分かりますか?私はwcf rest serviceからjsonの応答を得ることができません。wcf RESTサービスとJQuery Ajax投稿:メソッドが許可されていません

の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ファイルであればアドレスは、これはあなたのサービスのためのエントリポイントですので、あなたがServiceRouteを使用している場合は、エンドポイントで、この相対アドレスを定義しているので、(あなたはこの

  • UserServiceのを再定義することができUserService.svc/UserService/ValidateUser

    • UserService.svcになります設定
    • のvalidateUserそれがあなたの操作のデフォルトのエントリポイントがあるので

    は、今すぐあなたのJSONリクエストは完全に悪いですし、あなたのメソッドのシグネチャとしても。ヨーヨーのメソッドシグネチャそのため、あなたJSONリクエストにはラッパー要素はありません

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

    と:

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

    と操作シグネチャは次のようになりますように、単一のJSONオブジェクトを期待しなければならないウルサービス契約は=それは、単一のデータコントラクトでなければなりませんBareを使用する必要があります。また、レスポンス形式を設定する必要もありません。なぜなら、レスポンス形式をエンドポイントレベルに設定するからです(btw。そうでない場合は、要求形式も設定する必要があります)。

    あなたはあなたの要求のためのデータコントラクトを定義したら、正しく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オブジェクトを文字列としてです!すべてのメンバーも同様です!あなたはエンドポイント定義でkindを使用する必要がありますし、あなたが行動を指定する必要はありませんstandardEndpointを使用する場合(これは、標準的なエンドポイントの一部である)

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

    :最後のために

    はにあなたの設定を変更します。また、クロスドメインコールを使用していないため、有効にする必要はなく、自動的に解決されるため、デフォルトのフォーマットは必要ありません。

  • +0

    .svcファイルなしでWCFで作業しています。 – h3n

    +0

    私はあなたの修正に従いました。試してみました。契約 'IUserService'のオペレーション 'ValidateUser'は、ラッパー要素なしで直列化される複数のリクエストボディパラメーターを指定します。最大1つのbodyパラメーターは、ラッパー要素なしで直列化することができます。追加のボディパラメーターを削除するか、WebGetAttribute/WebInvokeAttributeのBodyStyleプロパティをWrappedに設定します。 – h3n

    +0

    私の変更に従わなかったのは、私の 'ValidateUser'に複数のリクエストボディパラメータがないためです。 –

    1

    1つのドメインでテストしたところ、著者が別のドメインからの呼び出しを試みたとします。クロスドメインコールが原因で不可能になる可能性があります。

    2

    私はイワンが正しい道にここにいると信じています!

    ブラウザでJavaScriptからサービスを呼び出していますか?

    そのjavascriptを使用したhtmlページは、wcfサービスと同じドメインにありますか?

    彼らは同じドメインにない場合、私はそれがクロスサイトスクリプティング問題であると言うでしょう。私はGETがクロスサイトを許可されていると信じていますが、POSTはできません。 http://en.wikipedia.org/wiki/JSONPは、(WCFによる)サーバーサイドでサポートされている場合、解決策になります。

    +0

    クロスドメインWCF REST JQuery Ajax CallでPOSTが許可されていないと述べました。あなたは私にそれのソースを教えてもらえますか?なぜなら、あなたのポストからは、クロスドメインでは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