C# httpwebrequest发布json不正确

C# httpwebrequest发布json不正确,c#,asp.net,json,http,C#,Asp.net,Json,Http,编辑:好的,看来发布为应用程序/json需要在服务器端单独处理,而不是表单。有没有更好的方法将表单作为复杂对象在C#中发布?弦:弦就是剪不开它。例如,我希望能够使用字典生成: { "data_map":{"some_value":1,"somevalue":"2"}, "also_array_stuffs":["oh look","people might", "want to", "use arrays"], "integers_too":4 } ---OP--- 我看过某处和其他地方

编辑:好的,看来发布为应用程序/json需要在服务器端单独处理,而不是表单。有没有更好的方法将表单作为复杂对象在C#中发布?弦:弦就是剪不开它。例如,我希望能够使用字典生成:

{
 "data_map":{"some_value":1,"somevalue":"2"},
 "also_array_stuffs":["oh look","people might", "want to", "use arrays"],
 "integers_too":4
}
---OP---

我看过某处和其他地方。我只是尝试将JSON字符串发布到URL,但服务器端一直将内容解释为字符串而不是查询dict。我们还有其他不使用c#的客户端,它们对服务器端的影响很好(使用HTML、JS、Objective-c、Java),但由于某种原因,从c#客户端返回的POST数据不可靠

C#资料来源:

私有静态字典PostRequest(字符串url、字典VAL)
{           
var httpWebRequest=(httpWebRequest)WebRequest.Create(BaseURL+url);
httpWebRequest.ContentType=“application/json;charset=utf-8”;
httpWebRequest.Method=“POST”;
使用(var streamWriter=newstreamwriter(httpWebRequest.GetRequestStream()))
{
字符串json=JsonFx.json.JsonWriter.Serialize(VAL);
//json=json.Substring(1,json.Length-1);
streamWriter.Write(json);
streamWriter.Close();
}
尝试
{
var httpResponse=(HttpWebResponse)httpWebRequest.GetResponse();
使用(var streamReader=newstreamreader(httpResponse.GetResponseStream())
{
字符串响应=streamReader.ReadToEnd();
Dictionary retval=JsonFx.Json.JsonReader.Deserialize(响应);
返回返回;
}
}
捕获(WebE例外)
{
}
返回null;
}
这被称为:

public static void Main (string[] args)
{   
    Dictionary<string,object> test = new Dictionary<string, object>();
    test.Add("testing",3);
    test.Add("testing2","4");

    Dictionary<string,object> test2 =  PostRequest("unitytest/",test);          
    Console.WriteLine (test2["testing"]);
}
publicstaticvoidmain(字符串[]args)
{   
字典测试=新字典();
测试。添加(“测试”,3);
测试。添加(“测试2”、“4”);
字典test2=PostRequest(“unitytest/”,test);
Console.WriteLine(test2[“testing”]);
}
无论出于何种原因,这都是传递的请求对象:

<WSGIRequest
GET:<QueryDict: {}>,
POST:<QueryDict: {u'{"testing":3,"testing2":"4"}': [u'']}>,
COOKIES:{},
META:{'CELERY_LOADER': 'djcelery.loaders.DjangoLoader',
 'CONTENT_LENGTH': '28',
 'CONTENT_TYPE': 'application/json; charset=utf-8',
 'DJANGO_SETTINGS_MODULE': 'settings.local',
 'GATEWAY_INTERFACE': 'CGI/1.1',
 'HISTTIMEFORMAT': '%F %T  ',
 'HTTP_CONNECTION': 'close',
 'LANG': 'en_US.UTF-8',
 'QUERY_STRING': '',
 'REMOTE_ADDR': '127.0.0.1',
 'REMOTE_HOST': '',
 'REQUEST_METHOD': 'POST',
 'RUN_MAIN': 'true',
 'SCRIPT_NAME': u'',
 'SERVER_PORT': '9090',
 'SERVER_PROTOCOL': 'HTTP/1.0',
 'SERVER_SOFTWARE': 'WSGIServer/0.1 Python/2.7.2+',
 'SHELL': '/bin/sh',
 'SHLVL': '1',
 'SSH_TTY': '/dev/pts/0',
 'TERM': 'xterm',
 'TZ': 'UTC',
 'wsgi.errors': <open file '<stderr>', mode 'w' at 0x7f3c30158270>,
 'wsgi.file_wrapper': <class 'django.core.servers.basehttp.FileWrapper'>,
 'wsgi.input': <socket._fileobject object at 0x405b4d0>,
 'wsgi.multiprocess': False,
 'wsgi.multithread': True,
 'wsgi.run_once': False,
 'wsgi.url_scheme': 'http',
 'wsgi.version': (1, 0)}>
[18/Oct/2012 19:30:07] "POST /api/1.0/unitytest/ HTTP/1.0" 200 31
,
“wsgi.file_包装器”:,
“wsgi.input”:,
“wsgi.multiprocess”:False,
'wsgi.multi-thread':True,
'wsgi.run_once':False,
'wsgi.url_scheme':'http',
'wsgi.version':(1,0)}>
[18/Oct/2012 19:30:07]“POST/api/1.0/unitytest/HTTP/1.0”200 31

请求中一些更敏感的数据已被删除,但与此无关

呃,我希望我不要养成回答自己问题的习惯

因此,以这种方式发布Json与普通表单提交不同。这意味着,如果您的服务器端只希望正常的表单提交,那么它将无法工作。C#代码按预期执行,但只提交一个JSON字符串作为POST正文。尽管这对验证、清理和处理原始输入的人员来说可能很方便,但请记住,如果您使用的是普通web框架,则必须编写一个替代条件来接受原始字符串


如果有人知道如何在C#中提交表单,其中包含比hashmap/字符串字典更复杂的对象,那么我将投票支持你的答案,并热烈拥抱你。就目前而言,这种胡说八道的做法是必须的。

好吧,很久以前,我曾经实现了一个银行应用程序前端,它大量使用JSON在客户端和服务器之间进行通信

这是一种在服务器之间查找复杂对象的干净方法,无需进行复杂的清理或原始字符串处理

关键是在服务器端使用为ajax设计的web服务,您的web服务器类应该如下所示:

[WebService(Namespace = "http://something.cool.com/")]
[ScriptService] // This is part of the magic
public class UserManagerService : WebService
{
    [WebMethod]
    [ScriptMethod] // This is too a part of the magic
    public MyComplexObject MyMethod(MyComplexInput myParameter)
    {
        // Here you make your process, read, write, update the database, sms your boss, send a nuke, or whatever...

        // Return something to your awaiting client
        return new MyComplexObject();
    }

}
现在,在您的客户端上,设置使ASP.NET能够用JSON与您对话的内容,我使用JQuery发出ajax请求

$.ajax({ 
    type: 'POST', 
    url: "UserManagerService.asmx/MyMethod", 
    data: { 
        myParameter:{
            prop1: 90,
            prop2: "Hallo",
            prop3: [1,2,3,4,5],
            prop4: {
                // Use the complexity you need.
            }
        }
    }, 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    success: function(response) {
        alert(response.d);
    }
});

ASP希望作为ScriptMethod的结果返回的任何内容都将包含在response.d变量中。假设您从服务器返回一个复杂对象,“response.d”是对您的对象的引用,您可以像往常一样使用点符号访问所有对象成员

我已经编辑了你的标题。请参阅“”,其中共识是“不,他们不应该”。在发送json字符串之前,您能否确认它是正确的?i、 e.打印
JsonFx.Json.JsonWriter.Serialize(VAL)的结果。这是正确的。看来这毕竟可能是Django的问题。当我手动设置帖子主体时,我得到了相同的结果。这是非常离题的。客户端使用的是C#,而不是javascript。Javascript不是一个选项。它必须是C#,在我的特殊情况下,我还需要让库与Unity和.Net一起工作,尽管这些细节没有明确说明。服务器端是用Django编写的。我对ASP不感兴趣
$.ajax({ 
    type: 'POST', 
    url: "UserManagerService.asmx/MyMethod", 
    data: { 
        myParameter:{
            prop1: 90,
            prop2: "Hallo",
            prop3: [1,2,3,4,5],
            prop4: {
                // Use the complexity you need.
            }
        }
    }, 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    success: function(response) {
        alert(response.d);
    }
});