如何在 WebMethod 中接收非原始数据?
Posted
技术标签:
【中文标题】如何在 WebMethod 中接收非原始数据?【英文标题】:How to receive Non-primitive data in WebMethod? 【发布时间】:2017-11-27 08:32:42 【问题描述】:我正在尝试通过 javascript 将字节数组传递给我的 WebMethod。 问题是我的 WebMethod 返回消息“测试表单仅可用于作为参数的原始方法。”
当我将数据类型更改为字符串或任何其他类型的原始变量时,WebMethod 接受它会继续。
我正在将一个对象转换为一个字节[],使用 MessagePack 命名为 msgpackEnvio(转换本身发生得很好),然后发送到 WebService。
这是我使用 jquery 对 WebService 的请求
$.ajax(
beforeSend: function (request)
request.setRequestHeader("Content-Type", "application/json");
,
processData: false,
dataType: "json",
url: url,
data: msgpackEnvio,
type: "POST",
error: function (data)
$('#upload-load').hide();
$('.bt-enviar-excel').removeAttr('disabled', 'disabled');
var msg = document.getElementsByClassName('msg')[0];
msg.style.color = 'red';
msg.innerhtml = 'Erro interno servidor!';
,
success: //some code
其实上面的代码根本不重要,我的问题是在webService中,如何让它接收一个数组或者对象。
这是我的 WebMethod 应该能够接收一个字节[]
[WebMethod]
public string TestMessagePack(byte[] name)
//my code
return "Finish";
【问题讨论】:
【参考方案1】:您可以使用 base64 编码和解码将字节数组作为字符串发送。除此之外,您可能还想使用发布请求和 JSON 序列化/反序列化。在复杂的 C# 对象和 javascript 对象之间不会有一个通用的尺寸适合所有转换,这就是为什么只允许原始参数的原因,所以对于非原始的东西,你需要一个翻译层。这通常意味着某种形式的字符串序列化和反序列化。
【讨论】:
我试过了,但我要解决的问题正是这个。当我读取一些对象时,我的 json 变得如此之大,以至于与 WebService 的连接需要很长时间,甚至有时会出现时间连接错误。我真的需要更改 WebService 方法以接收非原始 javascript 如何知道构建一个 C# 可以理解的非原始对象?复杂对象将依赖于它们的语言和环境,它们实际上看起来像引擎盖下的样子,因此为了弥补这一差距,序列化开始发挥作用。复杂对象将需要以一种或另一种方式序列化为字符串(两个层都知道如何处理的原始类型)以发送和从字符串反序列化回复杂对象以接收。 JSON/XML/etc 和 base64 是你的朋友。 一些更简单的类型将能够自动序列化和反序列化,尽管这不是我所依赖的东西,如果它们变得更复杂,你无论如何都需要转向 json 或 xml 之类的东西。此错误消息来自哪里?它不在引用的代码中,也不是标准错误消息。以上是关于如何在 WebMethod 中接收非原始数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jQuery.dataTables 1.10 向 ASP.NET WebMethod 后端发送和接收 JSON?
如何在 Linux 中创建原始套接字而不缓冲接收数据包?是不是可以?