JSON 字符串化到 C# Webservice

Posted

技术标签:

【中文标题】JSON 字符串化到 C# Webservice【英文标题】:JSON stringify to C# Webservice 【发布时间】:2012-03-18 03:17:01 【问题描述】:

我知道有一些问题,但我已经尝试了很多,但我什至无法将我的脚本发送到服务器。这是我目前拥有的:

Javascript

function UpdateSessionUser(user)

    if (user != null)
    
        var targetPage = "http://" + document.location.host + "/Sitefinity/Services/Sandbox/SessionUsers.asmx/UpdateSessionUser";
        var dataText =  "jsonUser" : JSON.stringify(user) ;

        try
        

            $.ajax(
                type: "POST",
                url: targetPage,
                data: dataText,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (response)
                
                    alert(response.d);
                    return true;
                ,
                failure: function (msg)
                
                    alert(msg);
                    return false;
                
            );
        
        catch (err)
        
            alert(err);
        
    

用户对象示例

Object
BaseID: "fe85149c-71f2-4c61-b7c6-a00300e2f84e"
HasChanged: true
IsReferralReceived: false
IsReferralRequired: true
IsSeatApproved: true
Name: "Miles"
ReferralFromUser: null
ReferralFromUserID: null
ReferralReceivedBy: null
ReferralReceivedByUserID: null
ReferralReceivedOn: "/Date(-62135578800000)/"
RegisteredOn: "1330281960000"
SeatApprovedBy: null
SeatApprovedByUserID: null
SeatApprovedOn: "/Date(-62135578800000)/"
SeatNumber: "2"
SessionID: "d0773d5e-aeeb-4b9c-b606-0a564d6c5845"
UserID: "6af2fd9e-b4b6-4f5a-8e9c-fe7ec154d4e5"
__type: "SandboxClassRegistration.SessionUserField.ClientSessionUser"

C#

[WebMethod]
public bool UpdateSessionUser(object jsonUser)

    return SessionUserHelper.UpdateSessionUser(new ClientSessionUser(jsonUser));

为什么我的 JSON 调用永远不会到达服务器?我在函数的最开始处(返回之前)设置了一个断点,这样我就可以查看 jsonUser 对象参数,但它永远不会在那里。

我得到的只是这个错误:

POST http://localhost:60877/Sitefinity/Services/Sandbox/SessionUsers.asmx/UpdateSessionUser500(内部服务器错误)

--- 更新

这是最终结果(我必须“字符串化”对象,然后发送最终的 dataText)。 webservice方法没有改变

function CallWebServiceToUpdateSessionUser(target, user)
    
        var dataText =  "jsonUser": JSON.stringify(user) ;

        $.ajax(
            type: "POST",
            url: target,
            data: JSON.stringify(dataText),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (response)
            
                alert(response.d);
                return true;
            ,
            failure: function (msg)
            
                alert(msg);
                return false;
            
        );
    

【问题讨论】:

500 是服务器错误。您的呼叫确实 到达了服务器。查看应用程序事件日志,查看是否有 ASP.NET 警告显示发生的异常。 好电话。我通过 Visual Studio 在本地运行它,我检查了我的 Windows 应用程序日志,当然......那里什么都没有:( 确保ASP.NET Health Monitoring 已打开。 <system.web> <healthMonitoring enabled="true"/></system.web> 你能得到服务吗?在您的浏览器中转到:localhost:60877/Sitefinity/Services/Sandbox/SessionUsers.asmx,如果是,您是否看到列出的 UpdateSessionUser 方法?另外,document.location.host 是否包含端口号? 如果对 dataText 进行字符串化,效果会更好吗?我相信我总是传递一个 json 字符串而不是一个对象。 【参考方案1】:

我不知道有多少帮助:

尝试改变这个

 var dataText =  "jsonUser" : JSON.stringify(user) ;

  var dataText = JSON.stringify( "jsonUser" : user );

【讨论】:

我最终不得不“字符串化”这两个项目。 (我将它添加到我的问题的底部) 我不确定你是否需要字符串化两次,但如果它有效,那就没关系 是的,我有点明白它的作用了,我不再碰它了;)【参考方案2】:

我认为您需要将服务方法标记为启用 JASON。

[WebMethod] 
[ScriptMethod(UseHttpGet = true,ResponseFormat = ResponseFormat.Json)] 
public bool UpdateSessionUser(object jsonUser) 

     return SessionUserHelper.UpdateSessionUser(new ClientSessionUser(jsonUser));
 

【讨论】:

【参考方案3】:

我意识到这个问题在不久前就得到了回答,但我遇到了类似的问题,并想提供一些有关 OP 解决方案为何有效的详细信息

我假设 Web 服务需要一个字符串,它将反序列化并使用它

在这种情况下,调用JSON.stringify("jsonUser": user) 不会将user 对象转换为字符串,这会导致服务器出现问题。

当您调用JSON.stringify("jsonUser": JSON.stringify(user)) 时,您的user 对象将转换为字符串,所有引号均已正确转义。

希望这对将来的人有所帮助。

这是说明http://jsfiddle.net/dvwCg/2/的小提琴:

HTML

<h1>webservice breaks</h1>
<span id="s1"></span>
<h1>webservice works</h1>
<span id="s2"></span>

JS

var jsonObject = "a":1, "b":["x":"test", "y":12, "x":"test2", "y":120];

$("#s1").text(JSON.stringify("d" : jsonObject));
$("#s2").text(JSON.stringify("d" : JSON.stringify(jsonObject)));

附言

https://***.com/a/6323528/3661 也有很多有用的信息。

【讨论】:

以上是关于JSON 字符串化到 C# Webservice的主要内容,如果未能解决你的问题,请参考以下文章

C#如何生成JSON字符串?(序列化对象)

C#如何生成JSON字符串提交给接口(服务器)

在 C# 中解析 Json 字符串

JSON C# Class Generator ---由json字符串生成C#实体类的工具

如何解析会导致非法 C# 标识符的 JSON 字符串?

将 JSON 字符串反序列化为多个 C# 对象