如何在 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?

将数据从 WebMethod 返回到 ajax

AJAX如何解析后台传来的json数据?

如何在 Linux 中创建原始套接字而不缓冲接收数据包?是不是可以?

如何使用 Laravel 的流畅查询构建器混合原始 SQL 和非原始 SQL

如何将 webmethod 与 Telerik 批量编辑网格一起使用