WCF receiving empty int

本文关键字:int empty receiving WCF | 更新日期: 2023-09-27 18:09:10

由于某些原因,我的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视为空字符串?

WCF receiving empty int

好了,伙计们,我在处理了一些更复杂的对象后发现了这个问题。

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

现在我的服务函数是这样的

    [OperationContract]
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest,  UriTemplate = "/Products", ResponseFormat = WebMessageFormat.Json)]
    public Product GetProduct(string id)
    {
        int ID = Convert.ToInt32(id);
        Product selectedProduct = db.Products.Find(ID);
        return selectedProduct;
    }

您需要指定数据类型和类型为:

 $.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);
        }
    });

如果你只需要传递一个id,那么试着用URL传递它。

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

尝试直接发送整数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);
        }
    });