2012-07-10 18 views
6

OperationContractメソッドを使用して、データをクエリしてデータベースに挿入しようとしています。私はPOSTメソッドを使用しており、ブラウザのjavascriptからサービスを呼び出しています。 WCFサービスは同じドメインにありますので、JSONPを使用する必要はありません。また、GETリクエストではなく、POSTリクエストであるようにデータを変更しています。しかし、私はまだ "Method not allowed error"を取得しています。誰もこのような状況に遭遇しましたか?WCF WebInvoke POST - メソッドが許可されていないエラー

私のサービスは不思議

http://some_url.com/services/ProfileService.svc/json/CurrentUser 

で呼ばれている、私がPOSTをspecifiyにもかかわらず、私はこのURLを行くときGET要求によって呼び出されるようです。ただし、ページの読み込みでは、POSTリクエストが試行されているようです。

ブラウザの応答がURLに行くとき:ここ

Request URL:http://some_url.com/services/ProfileService.svc/json/CurrentUser 
Request Method:GET 
Status Code:405 Method Not Allowed 
Request Headersview parsed 
GET /services/ProfileService.svc/json/CurrentUser HTTP/1.1 

は私が呼んしようとしている私の方法です:

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

public HIPUser GetCurrentUser() 
{ 
    string[] domainUser; 
    string Auth_User = HttpContext.Current.User.Identity.Name.ToString().ToLower(); 
    domainUser = Auth_User.Split('\\'); 
    string user = domainUser[1]; 
    Debug.WriteLine(user); 

    ProfileManager pm = new ProfileManager(); 
    var results = pm.GetUserByUserName(user); 

    if (results.Length > 0) 
    { 
     return results.First(); 
    } 
    else 
    { 
     Debug.WriteLine("IS NULL"); 
     var x = pm.CreateUser(user, null, null); 
     Debug.WriteLine(x.UserName); 
     return x; 
    } 
} 

クライアント:必要に応じて

function getCurrentUser() { 

$.ajax({ 
    type: "POST", 
    url: "services/ProfileService.svc/json/GetCurrentUser", 
    contentType: "application/json; charset=utf-8", 
    data: null, 
    dataType: "json", 
    error: function (request, error, u) { 
     alert('blargherror: ' + error); 
    }, 
    success: function (result, status) { 
     alert(result.d); 
    } 
}); 
} 

わかりませんしかしWeb.Config

Web.Configへ
<behaviors> 
    <endpointBehaviors> 
     <behavior name="jsonBehavior"> 
      <enableWebScript /> 
     </behavior> 
    </endpointBehaviors> 

    <serviceBehaviors> 
     <behavior name="metaBehavior"> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <serviceMetadata httpGetEnabled="true" /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 

<serviceHostingEnvironment 
    aspNetCompatibilityEnabled="true" 
    multipleSiteBindingsEnabled="true" /> 

<services> 
    <service name="ProfileService" behaviorConfiguration="metaBehavior"> 
     <endpoint address="/json" 
      behaviorConfiguration="jsonBehavior" 
      binding="webHttpBinding" 
      bindingConfiguration="secure" 
      contract="ProfileService" /> 
     <endpoint address="" 
      binding="basicHttpBinding" 
      bindingConfiguration="secure" 
      contract="ProfileService" /> 
    </service> 
</services> 

編集 - 私はこれを理解することができたバインディング

<bindings> 
     <webHttpBinding> 
      <binding name="secure"> 
       <security mode="TransportCredentialOnly"> 
        <transport clientCredentialType="Windows"/> 
       </security> 
      </binding> 
     </webHttpBinding> 
     <basicHttpBinding> 
      <binding name="secure"> 
       <security mode="TransportCredentialOnly"> 
        <transport clientCredentialType="Windows" /> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
+2

これで問題は解決しませんが、nullの代わりにデータとして '' {} ''を渡すことをお勧めします(http://encosia.com/3-mistakes-to-avoid-when-using-jquery -with-aspnet-ajax /) – Jupaol

+0

この記事をありがとう! – jocey

+2

私はあなたのコードに間違いを見つけることができません、私はちょうど同じ設定で同じようなサービスを作成し、正しく動作します、唯一の違いは 'bindingConfiguration =" secure "'です。あなたが投稿することができればそれは役に立つだろう。そのバインディング構成を削除して、サービスにアクセスできるかどうかを確認しようとしましたか? – Jupaol

答えて

1

を追加します。戻り値オブジェクトが不明な型の問題がありました。したがって、JSONオブジェクトにシリアル化することができませんでした。私のメソッドで動作させるためにオブジェクトをシリアライズする方法がわからなかったので、独自のカスタムJSON文字列を構成する文字列を返すメソッドを変更し、eval()関数を使用してJSONオブジェクトに変換しました。

関連する問題