通过 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序列化对象