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,
を持つことが必要。
IE 9ネットワークトレーサによれば、http GETは次のURLにあります。(本来注意したように):GET /Services/UserByEmailService.svc/GetUserByEmail?{"email":%20"[email protected] "} 「コントロールが拾われていることはかなり確信している。 –
それで、なぜ '/Services/UserByEmailService.svc/GetUserByEmail?email = jbrown @ mooseware.ca'の代わりにそれがあなたのjsonを文字列の電子メール変数に変えようとしていると信じています。ヌルに終わる。 –
Matt。この問題は、jQueryが 'data'引数と' processData'の値をどのように解釈しているかが分かりました。編集した質問で詳細を見ることができます。あなたの助けをありがとう。 –