【问题标题】:Pass Byte Array that was in Session object to a Web Service (Asp.Net 2.0 asmx) through a JSON object通过 JSON 对象将 Session 对象中的字节数组传递给 Web 服务(Asp.Net 2.0 asmx)
【发布时间】: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 我不知道如何使用调试器进行响应调用。我会谷歌它。谢谢

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


【解决方案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/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 2014-10-28
  • 1970-01-01
相关资源
最近更新 更多