2011-09-06 21 views
3

jQueryを使用してWCFサービスを呼び出すASP.NETページがあります。ページは、テキストボックスコントロールの内容をサービスに渡します。サービスはこのテキストボックス値を使用してレコードを検索し、POCOをjQueryに返して、他のコントロールの内容を更新します。WCFへのjQuery呼び出しパラメータがnullとして返される

少なくとも、これは私が起こそうとしていることです。

これまでのところ、私の問題は、WCF Operationに渡される文字列パラメータが常にnullであることです。私はjQueryの部分を正しく処理してはいけないと思います。私は、パラメータなしで、またはハードコーディングされたパラメータでWCFサービスへのjQueryコールの例をたくさん見つけることができます。私は多くの時間を費やし、ここやその他のサイトで多くの質問を見ました。まだ運がありません。私も同じページでjQuery .autocompleteによって呼び出されている別のWCFサービスを持っています。これはうまく動作しています。

私はネットワークトラフィックをトレースすると、私は要求が通過していることがわかります。要求は次のようになります。ここでは

GET /Services/UserByEmailService.svc/GetUserByEmail?{"email":%20"[email protected]"} 

私のjQueryのコードされています

<script type="text/javascript"> 
    $("#txtEmail").blur(function (event) { 
     $.ajax({ 
      type: "GET", 
      contentType: "application/json; charset=utf-8", 
      url: "/Services/UserByEmailService.svc/GetUserByEmail", 
      data: '{"email": "' + $("#txtEmail").val() + '"}', 
      processData: false, 
      success: function (response) { 
       $("#lblUserID").html = response.d.UID; 
       $("#txtOrganization").html = response.d.Organization; 
       $("#txtPhone").html = response.d.Phone; 
       $("#txtName").html = response.d.Name; 
       $("#txtNotes").html = response.d.Name; 
       $("#hdnUserKey").html = response.d.Syskey; 
      } 
     }); 
    }); 
</script> 

これは私のWCFサービスのコードは次のようになります...

[ServiceContract(Namespace = "")] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class UserByEmailService 
{ 
    [OperationContract] 
    [ServiceKnownType(typeof(UserLookupResult))] 
    [WebGet(BodyStyle = WebMessageBodyStyle.WrappedRequest, 
     RequestFormat = WebMessageFormat.Json, 
     ResponseFormat = WebMessageFormat.Json)] 
    public UserLookupResult GetUserByEmail(string email) 
    { 
     UserLookupResult oResult = new UserLookupResult(); 
     try 
     { 
      using (DownloadDBEntities ctx = new DownloadDBEntities()) 
      { 
       DownloadDB.User oUser = ctx.Users.FirstOrDefault(a => a.Email == email); 
       if (oUser != null) 
       { 
        oResult.Syskey = oUser.Syskey.ToString(); 
        oResult.UID = oUser.UserID; 
        oResult.Name = oUser.Name; 
        oResult.Organization = oUser.Organization; 
        oResult.Phone = oUser.Phone; 
        oResult.Notes = oUser.Notes; 
       } 
      } 
     } 
     catch (Exception ex) 
     { // For debugging only... 
      System.Diagnostics.Debug.WriteLine(ex.ToString()); 
     } 
     return oResult; 
    } 
} 

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class UserLookupResult 
{ 
    public string Syskey { get; set; } 
    public string UID { get; set; } 
    public string Name { get; set; } 
    public string Organization { get; set; } 
    public string Phone { get; set; } 
    public string Notes { get; set; } 

    public UserLookupResult() 
    { 
     Syskey = string.Empty; 
     UID = string.Empty; 
     Name = string.Empty; 
     Organization = string.Empty; 
     Phone = string.Empty; 
     Notes = string.Empty; 
    } 
} 

が、私はこのコードをトレースすることができます私はそれが期待されるときに実行します。ただし、GetUserByEmailメソッド(email)の文字列引数は、値がリクエストを介して渡されていることがわかりますが(上記参照)、常にnullです。

コントロールの内容を使ってルックアップを実行できるように、コントロールのぼかしでテキスト値をWCFサービスに渡すjQuery呼び出しの実例を誰かが指摘できますか? JavaScriptやWCFのサービス定義に間違っていることが分かりますか?

編集:ここでは私の分解能は...この問題の支援のためのIAbstractDownvoteFactor、マット・フィリップスとdarthjitに

感謝します。結局、私は$.ajax呼び出しのdata引数のバリエーションでこの問題を解決できました。これは私のために働いてしまったものです:私はもともと、どのような最終的に働いていたものとの違いは、私のデータ引数は引用符で囲まれたキー値を持つJSONオブジェクトとして渡されなければならなかったということであることを

data: { "email": $("#txtEmail").val() }, 

注意。

私が最終的に私をかむことになるのか、この解決策が複数の引数を持つサービスに一般化するのか分かりません。もともと、私はEncosia's Blogで読んだことのためにJSON文字列としてデータ引数を整列化しようとしていました.jQueryは、データオブジェクトをWebサービスに直接渡すのではなく、URLエンコードしようとします。私はもう一人のブログ記事を見たことがありました。私はあなたの外側の引用符が二重引用符か一重引用符かどうかは重要であると言いました。

また:マットが指摘したように、私も、私は$.ajax呼び出しからこの引数を削除することで、デフォルトでは得processData = true,を持つことが必要。

答えて

1

入力フィールドIDが正確にtxtEmailの綴りでない場合、入力が見つからず、val()が何もしないため、nullが返されます。あなたはファイトラーやhttpリスナーの何かを見て、ajax呼び出しがポストしているURLそのものを確認できますか?

編集: $.ajaxコールのオプションprocessDataを見てください。 jQueryのドキュメント

processDataBoolean 
Default: true 
By default, data passed in to the data option as an object (technically, anything other  
than a string) will be processed and transformed into a query string, fitting to the  
default  
content-type "application/x-www-form-urlencoded". If you want to send a DOMDocument, or  
other non-processed data, set this option to false 

から は真にそれを変更してみて、それが助けかどうかを確認します。提案の

+0

IE 9ネットワークトレーサによれば、http GETは次のURLにあります。(本来注意したように):GET /Services/UserByEmailService.svc/GetUserByEmail?{"email":%20"[email protected] "} 「コントロールが拾われていることはかなり確信している。 –

+0

それで、なぜ '/Services/UserByEmailService.svc/GetUserByEmail?email = jbrown @ mooseware.ca'の代わりにそれがあなたのjsonを文字列の電子メール変数に変えようとしていると信じています。ヌルに終わる。 –

+0

Matt。この問題は、jQueryが 'data'引数と' processData'の値をどのように解釈しているかが分かりました。編集した質問で詳細を見ることができます。あなたの助けをありがとう。 –

0

カップル:

  1. あなたはあなたのサービスは、REST-fulがあるように結合webHttpBindingを設定する必要があるかもしれません
  2. あなたはこの

のようなURIテンプレートを設定する必要があります[ OperationContract] 〔のWebGet(UriTemplate = "GetUserBYEmail?メール= {メール}")] 公共UserLookupResult GetUserByEmail(文字列メール)

+0

darthjit、ありがとうございます。私はこれらを試して、それはコンパイラのエラーとマニュアル.configの変更のウサギの穴の下に私を導いた。 UriTemplateは 'System.ServiceModel.Description.WebScriptEnablingBehavior'でうまく再生されません。 –

1

このライン:

data: '{"email": "' + $("#txtEmail").val() + '"}', 

は次のようになります。それは単純に文字列を送信して

data: {email: $("#txtEmail").val()}, 

jQueryのは、あなたの文字列がオブジェクトであると仮定することはできません。しかし、jQueryはオブジェクトと何をすべきかを正確に知っています。

+0

IAbstract、答えに感謝します。私はこれのバリエーションが必要であることが判明しました - 詳細について私の編集された質問を見てください。あなたは私を解決策の道に導いた。ありがとう! –

関連する問題