通过JSON对象将Session对象中的Byte Array传递给Web Service(Asp.Net 2.0 asmx)

时间:2011-10-18 05:12:11

标签: c# asp.net json web-services

我有一个代码:

Session [“timestamp”]中有一个字节数组,使用LInq to Entity

现在,当我调用此函数时,它会抛出错误

网络服务的签名如下:

[WebMethod]
public  string IsRowChanged(int en_id , byte[] timestamp)
{
}

如果我用字符串替换byte []到处都可以。

$.ajax({
    type: "POST",
    url: "UpdateEntityService.asmx/IsRowChanged",
    data: "{ 'en_id':'" + '<%= Request.QueryString["entity_id"] == null ? "1" : Request.QueryString["entity_id"] %>' + "' , 'timestamp': '" + '<%= (Session["timestamp"]) %>' + "'   }",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (msg) {

        var result = msg.d;

        if (result == "0") {

            save_valid();

            $.prompt("Data Saved Sucessfully");

        }
        else {

            $.prompt("Data Concurrency Error! Reload the Page.. by pressing F5");

        }

    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        alert(textStatus);
        alert(textStatus);
        alert(errorThrown);
    }
});

感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

您应该对二进制数据进行基本编码,然后在服务器端将其转换回byte []。

// returns a byte[]
System.Convert.FromBase64String(base64String);
// returns a string
System.Convert.ToBase64String(byteData);

答案 1 :(得分:4)

试试这个。将其作为字符串传递并将其转换为函数内的ByteArray

[WebMethod]
public  string IsRowChanged(int en_id , string ts)
{
    byte[] timestamp = Encoding.UTF8.GetBytes(ts);
    // rest of your function here
}

如果您不知道编码类型,请使用此功能

private byte[] ConvertStringToBytes(string input)
{
    MemoryStream stream = new MemoryStream();

    using (StreamWriter writer = new StreamWriter(stream))
    {
        writer.Write(input);
        writer.Flush();
    }

    return stream.ToArray();
}

使用的命名空间:using System.IO;

关键是,无论使用哪种编码,都使用相同的解码方法来检索它。以下是ASCII编码/解码的示例

在你的页面编码就像这样。

string value = ASCIIEncoding.ASCII.GetString(temp_array);
HttpContext.Current.Session["timestamp"] = value;

现在在这样的ASMX解码。

[WebMethod]
public  string IsRowChanged(int en_id , string ts)
{
    byte[] timestamp = Encoding.ASCII.GetBytes(ts);
    // rest of your function here
}

答案 2 :(得分:0)

不是将时间戳作为对象传递,而是将其转换为刻度,然后将其转换回日期时间对象。