jQuery对WCF服务参数的调用通过null来表示

时间:2011-09-06 22:21:40

标签: asp.net wcf jquery

我有一个使用jQuery调用WCF服务的ASP.NET页面。该页面将文本框控件的内容传递给服务。该服务使用此文本框值来查找记录,然后它将一个POCO返回给jQuery以更新一堆其他控件的内容。

至少,这就是我想要实现的目标。

到目前为止,我的问题是传递给我的WCF操作的字符串参数始终为null。我想我一定不能正确处理jQuery部分。我可以找到许多没有参数或硬编码参数的WCF服务的jQuery调用示例,我花了很多时间在SO和其他网站上查看了很多问题。仍然没有运气。我甚至在同一页面上有另一个由jQuery .autocomplete调用的WCF服务,这很好用。

当我跟踪网络流量时,我可以看到我正在收到请求。请求如下所示:

GET /Services/UserByEmailService.svc/GetUserByEmail?{"email":%20"jbrown@mooseware.ca"}

这是我的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,即使我可以看到通过请求传递了值(参见上文)。

有人能指出一个jQuery调用的工作示例,它在控件模糊时将文本值传递给WCF服务,以便可以使用控件内容执行查找吗?你能看到我在JavaScript或WCF服务定义中出错吗?

编辑:这是我的决议......

非常感谢IAbstractDownvoteFactor,Matt Phillips和darthjit对此问题的帮助。最后,我能够通过data调用$.ajax参数的变体来解决问题。这就是最终为我工作的原因:

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

请注意,我最初和最终工作之间的区别在于我的数据参数必须作为带有引用键值的JSON对象传递。

我不知道最终是否会咬我,或者这个解决方案是否会推广到具有多个参数的服务。我最初尝试将数据参数编组为JSON字符串,因为我在Encosia's Blog中读到了一些内容 - 它指出jQuery将尝试对数据对象进行URL编码,而不是直接将其传递给您的Web服务。我甚至看过另一篇博文,我在该文章中找不到,它说你的外部引号是双引号还是单引号都很重要。

另外:正如Matt指出的那样,我还需要processData = true,默认情况下我从$.ajax来电中删除此参数。

3 个答案:

答案 0 :(得分:1)

如果您输入的字段ID未拼写为txtEmail,则它将返回null,因为它无法找到输入,val()将无法为您执行任何操作。你能看一下fiddler或某种http监听器,看看ajax调用发布到的url本身是什么?

编辑: 查看processData电话的$.ajax选项。 来自jquery docs

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

尝试将其更改为true,看看是否有帮助。

答案 1 :(得分:1)

这一行:

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

应该是:

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

jQuery不能假设你的字符串是一个对象,所以它只是发送字符串。但jQuery确切知道如何处理对象。

答案 2 :(得分:0)

一些建议:

  1. 您可能需要设置绑定webHttpBinding,以便您的服务是REST-ful
  2. 您可能需要像这样设置URI模板
  3. [OperationContract的] [WebGet(UriTemplate =“GetUserBYEmail?email = {email}”)] public UserLookupResult GetUserByEmail(string email)