WCF接收空int

时间:2015-08-21 12:04:12

标签: javascript c# ajax wcf

由于某种原因,我的wcf服务没有正确地从我的POST接收数据。

它给了我这个错误:

  

服务器在处理请求时遇到错误。异常消息是'反序列化System.Int32类型的对象时出错。值''无法解析为'Int32'类型。'

ajax请求如下所示:

    $.ajax({
        method: "POST",
        contentType: "application/json",
        url: "ShopService.svc/Product",
        async: false,
        data: JSON.stringify({ id: 1 }),
        success: function (data) {
            returndata = data;
        },
        error: function (jqXHR, status, error) {
            alert(error);
        }
    });

服务代码是这样的:

    [OperationContract]
    [WebInvoke(UriTemplate = "/Product", Method = "POST", ResponseFormat = WebMessageFormat.Json)]
    public Product GetProduct(int id)
    {
        Product selectedProduct = db.Products.Find(id);

        return selectedProduct;
    }

我不知道这里出了什么问题,为什么服务器将id视为空字符串?

4 个答案:

答案 0 :(得分:0)

您需要指定数据类型并键入:

 $.ajax({
        contentType: "application/json; charset=utf-8",
        url: "ShopService.svc/Product",
        data: JSON.stringify({ id: 1 }),
             type: "POST",
            dataType: "json",
        success: function (data) {
            returndata = data;
        },
        error: function (jqXHR, status, error) {
            alert(error);
        }
    });

希望它有效。

答案 1 :(得分:0)

如果您只需传递id,请尝试使用网址传递它。

var id = 1; url: "ShopService.svc/Product/" + id;

答案 2 :(得分:0)

尝试直接发送整数1并删除内容类型,而不是发送一个字段id和值为1的json对象,因为服务需要整数而不是对象

$.ajax({
        method: "POST",
        url: "ShopService.svc/Product",
        async: false,
        data: 1,
        success: function (data) {
            returndata = data;
        },
        error: function (jqXHR, status, error) {
            alert(error);
        }
    });

答案 3 :(得分:0)

好吧,伙计们,我在处理了一些更复杂的物品后想出来了。

我需要将WebInvoke的BodyStyle属性设置为WrappedRequest以获得正确的反序列化。

所以现在我的服务功能如下:

a = np.random.randn(1000, 1000)

%timeit np.linalg.norm(a[1:2] - a, axis=1)
# 100 loops, best of 3: 5.43 ms per loop

%timeit np.sqrt(((a[1:2] - a) ** 2).sum(1))
# 100 loops, best of 3: 5.5 ms per loop

%timeit cdist(a[1:2], a)[0]
# 1000 loops, best of 3: 1.38 ms per loop

# check that all 3 methods return the same result
d1 = np.linalg.norm(a[1:2] - a, axis=1)
d2 = np.sqrt(((a[1:2] - a) ** 2).sum(1))
d3 = cdist(a[1:2], a)[0]

assert np.allclose(d1, d2) and np.allclose(d1, d3)