通过 JSON 对象将 Session 对象中的字节数组传递给 Web 服务(Asp.Net 2.0 asmx)

Posted

技术标签:

【中文标题】通过 JSON 对象将 Session 对象中的字节数组传递给 Web 服务(Asp.Net 2.0 asmx)【英文标题】:Pass Byte Array that was in Session object to a Web Service (Asp.Net 2.0 asmx) through a JSON object 【发布时间】:2011-12-09 19:14:41 【问题描述】:

我有一个代码:

Session["timestamp"] 中包含一个字节数组,使用 LInq to Entity

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

Web 服务的签名如下:

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


如果我在任何地方都用字符串替换字节[],它会起作用。

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

感谢任何帮助。

【问题讨论】:

在警报中,我在消息框中收到“错误”。我没有收到任何详细信息。即使我不知道字节数组是否以字符串的方式传递。所以这可能是问题 你为什么不放一个调试器并检查函数是否被调用?你也检查过萤火虫看你对电话的回应吗? @naveen 我不知道如何使用调试器进行响应调用。我会谷歌它。谢谢 【参考方案1】:

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

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

【讨论】:

您是否可以发布将字节 [] 转换为二进制数据的代码,以便我将其放入会话对象中。然后恢复它。我的 Web 方法的签名也应该是什么 @KamalDeepSingh 帖子已编辑...如果这对您不起作用,请告诉我【参考方案2】:

试试这个。将其作为字符串传递并在函数内部将其转换为 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

【讨论】:

@naveen byte[] 是 sql server 2008 的时间戳。当我使用 linq to Entity 时,我将它放在一个字节数组中。现在首先我需要将一个字节[] 转换为一个字符串,以便我将它放入一个会话对象中,然后再从字符串转换为字节[]。但是当我比较原始字节数组和转换为字符串并随后转换为字节 [] 的字节 araay 时,我得到了不同的结果。您能否发布代码以将字节 [] 也转换为字符串。我也不知道我正在使用的编码 您能展示将字节数组转换为字符串的代码吗? 字符串字符串; System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); str = enc.GetString(temp_array); HttpContext.Current.Session["timestamp"] = str; 这里是一个使用 ASCII 编码和解码的例子。 dijksterhuis.org/…

以上是关于通过 JSON 对象将 Session 对象中的字节数组传递给 Web 服务(Asp.Net 2.0 asmx)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用DataContractSerializer序列化对象

CLR 序列化

map和json之间的转换

Working With JSON

hibernate中 session.save(实体类)方法的原理

第三天的 No session 问题